একটি লিনাক্স / ইউনিক্স ব্যাশ স্ক্রিপ্ট কীভাবে তার নিজস্ব পিআইডি জানতে পারে?


149

আমার কাছে বাশ নামে একটি স্ক্রিপ্ট বলা হয়েছে Script.sh, এবং এটির নিজস্ব পিআইডি জানতে হবে (অর্থাত্ স্ক্রিপ্টের ভিতরে আমার পিআইডি পাওয়া দরকার)

কোন ধারণা কিভাবে এই কাজ করতে ?

উত্তর:



65

ব্যবহার $BASHPIDবা$$

দু'জনের মধ্যে পার্থক্য সহ আরও তথ্যের জন্য ম্যানুয়ালটি দেখুন ।

টি এল; DRTFM

  • $$ শেলের প্রসেস আইডিতে প্রসারিত হয়।
    • একটি ()সাব-শেল-এ, এটি সাবস্কেল নয়, চালিত শেলের প্রসেস আইডিতে প্রসারিত হয়।
  • $BASHPID বর্তমান বাশ প্রক্রিয়াটির প্রসেস আইডিতে প্রসারিত হয়।
    • একটি ()সাব-শেল-এ, এটি সাব-শেলের প্রসেস আইডিতে প্রসারিত হয়

10
মনে রাখবেন যে $$ এবং BASHPID সবসময় একই জিনিস হয় না - ম্যানুয়ালটিতে এটি উল্লেখ করা হয়েছে এবং আরও একটি সুনির্দিষ্ট উদাহরণ এখানে রয়েছে: tldp.org/LDP/abs/html/internvariables.html । পার্থক্যটি বেশ গুরুত্বপূর্ণ হতে পারে, যেহেতু প্রচুর ব্যাশ কনস্ট্রাক্টস সাবসেলের মাধ্যমে চালিত হয়।
ক্যাসাবেল

@ জেফ্রমি - উল্লেখ করেছেন। আমি ম্যানুয়ালটির সাথে যুক্ত হওয়ার কারণগুলির মধ্যে এটি ছিল।
tvanfosson

2
এটা লক্ষনীয় যে $BASHPIDBASH 4. BASH 3.x ব্যবহার করেন তাহলে নতুন হয়, তাহলে আপনি ব্যবহার করতে হবে$$
ব্রুনো Bronosky

36

জেফ্রোমি রেফারেন্সযুক্ত অ্যাডভান্সড বাশ স্ক্রিপ্টিং গাইডে দেওয়া উদাহরণ ছাড়াও , এই উদাহরণগুলি পাইপগুলি কীভাবে সাবশেল তৈরি করে তা দেখায়:

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

"<<<" এর অর্থ কি আপনি দয়া করে ব্যাখ্যা করতে পারেন? ধন্যবাদ।
সোপালাজো ডি অ্যারিরিজ

4
এটি একটি স্ট্রুপটিকে লুপে (বা যে কিছু পড়তে পারে stdin) পুনর্নির্দেশ করে । স্ট্রিংটিকে "এখানে স্ট্রিং" হিসাবে উল্লেখ করা হয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

8

পিআইডি সংরক্ষণ করা হয় $$

উদাহরণ: kill -9 $$শেল ইনস্ট্যান্সটি যেটিকে বলা হয়েছিল তা মেরে ফেলবে।


kill -9( -9পতাকা সহ )টিকে ক্ষতিকারক হিসাবে বিবেচনা করা হয় এবং এটি সম্পূর্ণরূপে প্রয়োজনীয় হলে ব্যবহার করা যেতে পারে)।
উইলেম ভ্যান অনসেম

3
এটিকে "বিপজ্জনক" হিসাবে বিবেচনা করা হয় কারণ প্রক্রিয়াটি সংকেতটিতে সাড়া দেওয়ার সুযোগ পায় না (এবং সম্ভবত নিজের পরে পরিষ্কার করা হয়)। করছেন kill -9 $$ঠিক 1 জিনিস। এটি বর্তমান শেল প্রক্রিয়াটিকে হত্যা করে । আপনি যদি শেল সেশনে এমন কিছু করেন যা আপনি পছন্দ করতে চান না .bash_history: এটি কার্যকর হয়:docker run -e PASSWORD=hunter2 ircbot
ব্রুনো ব্রোনোস্কি


0

যদি প্রক্রিয়াটি একটি শিশু প্রক্রিয়া হয় এবং AS BASHPID সেট না করা থাকে তবে চলমান প্রক্রিয়াটির তৈরি শিশু প্রক্রিয়াটির পিপিডকে জিজ্ঞাসা করা সম্ভব। এটি কিছুটা কুৎসিত হতে পারে তবে এটি কার্যকর। উদাহরণ:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.