শেল স্ক্রিপ্টে শেষ সম্পাদিত কমান্ডের পিড কীভাবে পাবেন?


254

আমি এই জাতীয় শেল স্ক্রিপ্ট পেতে চাই:

my-app &
echo $my-app-pid

তবে আমি জানি না কীভাবে স্রেফ এক্সিকিউটড কমান্ডের পিড পাবেন।

আমি জানি আমি jobs -p my-appপিড গ্রেপ করার জন্য কমান্ডটি ব্যবহার করতে পারি । তবে আমি যদি শেলটি একাধিকবার চালাতে চাই তবে এই পদ্ধতিটি কার্যকর হবে না। কারণ জবস্পেক অস্পষ্ট।

উত্তর:


338

শেষ সম্পাদিত কমান্ডের পিআইডি $!শেল ভেরিয়েবলে রয়েছে:

my-app &
echo $!

1
এটি যেমন পিড মুদ্রণ হয়। [1] 893। আমি কেবল সংখ্যা চাই
ব্যবহারকারী3153014

33
এটি লক্ষ করা উচিত যে এটি পটভূমিতে প্রোগ্রাম শুরু হয়েছে । যদি কোনও ব্যাকগ্রাউন্ড প্রক্রিয়া শুরু না করা হয় তবে প্যারামিটার সেট করা নেই।
ramrunner

5
আরেকটি উপযুক্ত সমাধানের পরামর্শ দেওয়া হয়েছে (একটি উত্তরের মন্তব্যে) কীভাবে সবেমাত্র শুরু হওয়া প্রক্রিয়াটির প্রশান্তি পেতে হবে : ওহ, এবং "অনলাইনার": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- সিসফল্ট নভেম্বর 24 '10 এ 14 : 28
ইম্জ - ইভান জ্যাকারিয়াচেভ

14
@ user3153014 "[2] 2625" এর মতো স্ট্রিংগুলি ব্যাকগ্রাউন্ড টাস্ক শুরু করার পরে শেল দ্বারা মুদ্রণ করা হয়। এটি আউটপুট সম্পর্কিত নয়echo $!
পেটর গ্লাদকিখ

প্রক্রিয়াটি শেষ না হওয়া পর্যন্ত আমার অপেক্ষা করতে হবে যখন আমি সাধারণত একটি স্ক্রিপ্টে এই জাতীয় কোড ব্যবহার করি। my-app & myVar=$! ; fgfgপ্রক্রিয়াটিকে আবার অগ্রভাগে আনে। আমি পরে মুদ্রণ করতে পারি echo $myVarএবং আমি নিশ্চিত যে আমার অ্যাপটি ইতিমধ্যে শেষ হয়েছে।
ভ্রাতা ব্লেজ

66

পান PID:

#!/bin/bash
my-app &
echo $!

PIDপরিবর্তনশীল মধ্যে সংরক্ষণ করুন :

#!/bin/bash
my-app &
export APP_PID=$!

PIDপাঠ্য ফাইলে সমস্ত দৃষ্টান্ত সংরক্ষণ করুন:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

আউটপুট, ত্রুটি এবং PIDপৃথক করা ফাইলগুলিতে সংরক্ষণ করুন :

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
প্রশ্নটি পুনঃনির্দেশের বিষয়ে জিজ্ঞাসা করেনি, তবে আপনার উত্তরটি বেশিরভাগরূপে গ্রহণযোগ্য হিসাবে একই হয় যদি ব্যতীত কোনও উদাহরণ my-appশেষ হয় এবং এর চেয়ে আরও খারাপ এটির পিআইডি পরে পুনরায় ব্যবহার করা হয় তবে আপনার ফাইলটিতে খারাপ তথ্য থাকবে। আমি মনে করি না যে এই উত্তরটি বিদ্যমান স্বীকৃত উত্তরে সত্যিকার অর্থে অনেক বেশি মূল্য যুক্ত করেছে
এরিক রেনোফ

@ এরিকরেনুফ পোস্ট আপডেট হয়েছে!
এডুয়ার্ডো কুওমো

অন্য একটি ডেরাইভেটিভ যা দরকারী হতে পারে। এই PID, পায় এবং একই সময়ে এটি একটি (বেশিরভাগই) ফোরগ্রাউন্ড প্রক্রিয়া হিসেবে একইরূপে: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe

অ্যাপ্লিকেশন = main &পিআইডি দখল করার উপায়?
মিস্টারমিজিজ

3

এরকম কিছু চেষ্টা করুন

pidof my_app >> /tmp/my_app.pid

1
বাহ্যিক কমান্ড, এবং ধীর, যদি সিস্টেম সরাসরি পিআইডি দিতে পারে তবে সমস্ত প্রক্রিয়াটি অনুসন্ধান করে কেন এটি খুঁজে পাওয়া যায়? এবং এছাড়াও, আপনি সঠিক মান পাবেন তা নিশ্চিত হতে পারে না
পাপো

-4

এরকম কিছু চেষ্টা করুন:

 ps ef | grep "[m]y-app" | awk '{print $2}'

আপনার প্রক্রিয়াটির প্রথম চিঠিটি মধ্যে রাখার বিষয়টি [ ]নিশ্চিত করে যে আপনি grepআপনার তালিকায় প্রক্রিয়াটি পাবেন না । প্রয়োজনে আপনি আপনার ব্যবহারকারীর নামটিতে একটি গ্রেপ যোগ করতে পারেন।


9
এটি সর্বোত্তমভাবে ভঙ্গুর এবং my-appএকাধিকবার মৃত্যুদন্ড কার্যকর করা হলে কাজ করে না - ডেভিডশেন ৮৪ বিশেষভাবে সেই ক্যাস সম্পর্কে উদ্বেগ প্রকাশ করে।
মাদুর

2
এমনকি আপনি যদি এই রুটেও যান তবে তার pgrepপরিবর্তে আপনার ব্যবহার করা উচিত ।
উইলেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.