প্রক্রিয়া কাঁটাচামচ এবং কার্যকর করার মধ্যে প্রায়শই বিভ্রান্তি ঘটে।
আপনি যখন bash
শেলের প্রম্পটে করবেন ।
$ sh -c 'exec env ps'
প্রম্পট জারি করা প্রসেস P1$
বর্তমানে bash
কোড চলছে । এই bash
কোডটি একটি নতুন প্রক্রিয়া পি 2 কাঁটাচামচ করে /bin/sh
যা কার্যকর করে যা পরে কার্যকর করে /usr/bin/env
, যা পরে কার্যকর করে /bin/ps
।
সুতরাং P2 এর পালাক্রমে মৃত্যুদন্ড কার্যকর করেছে কোড bash
, sh
, env
এবং ps
।
ps
(বা স্ক্রিপ্টের মতো অন্য কোনও কমান্ডের পরিবর্তে আমরা এখানে ব্যবহার করব) env
কমান্ড দ্বারা এটি কার্যকর করা হয়েছে তা জানার কোনও উপায় নেই ।
এটি কেবল যা করতে পারে তা খুঁজে বের করার জন্য এটির প্যারেন্ট প্রসেস আইডিটি কী, যা এক্ষেত্রে হয় পি 1 হবে বা 1
যদি পি 1 অন্তর বা লিনাক্সের পরিবর্তে সাব্রাইপার হিসাবে মনোনীত অন্য প্রক্রিয়াতে মারা গিয়েছে1
।
এরপরে এটি প্রক্রিয়াটি কোন কমান্ডের জন্য বর্তমানেreadlink /proc/<pid>/exe
লিনাক্সের মতো চলমান আছে বা কোনটি যুক্তি দিয়ে শেষ আদেশে কার্যকর হয়েছিল (যেমনটি করা হয়েছিল ps -o args= -p <pid>
) তার জন্য এটি অনুসন্ধান করতে পারে।
যদি আপনি চান যে আপনার স্ক্রিপ্টটি এটি জানতে চেয়েছিল, তবে একটি নির্ভরযোগ্য উপায় হ'ল চালকটি এটি বলবে। এটি পরিবেশগত ভেরিয়েবলের মাধ্যমে উদাহরণস্বরূপ করা যেতে পারে। উদাহরণস্বরূপ script1
:
#! /bin/sh -
INVOKER=$0 script2 &
এবং script2
:
#! /bin/sh -
printf '%s\n' "I was invoked by $INVOKER"
# and in this case, we'll probably find the parent process is 1
# (if not now, at least one second later) as script1 exited just after
# invoking script2:
ps -fp "$$"
sleep 1
ps -fp "$$"
exit
$INVOKER
( সাধারণত ) একটি পাথ থাকতে পারে script1
। কিছু ক্ষেত্রে, এটি যদিও আপেক্ষিক পথ হতে পারে, এবং সেই পথটি চলমান চলমান ডিরেক্টরিটির সাথে সম্পর্কিত script1
শুরু হয়েছিল। সুতরাং script1
কল করার আগে যদি বর্তমান চলমান ডিরেক্টরিটি পরিবর্তন করা হয় script2
, script2
এটি কী নামে ডাকা হয়েছে সে সম্পর্কে ভুল তথ্য পাবে। সুতরাং এটি নিশ্চিত করে বলা ভাল যে $INVOKER
কোনও নিখুঁত পথ রয়েছে (পছন্দমত বেস নামটি রাখা) যেমন লিখে লিখেছেন script1
:
#! /bin/sh -
mypath=$(
mydir=$(dirname -- "$0") &&
cd -P -- "$mydir" &&
pwd -P) && mypath=$mypath/$(basename -- "$0") || mypath=$0
... some code possibly changing the current working directory
INVOKER=$mypath script2
পসিক্স শেলগুলিতে, $PPID
সেই শেলের আরম্ভের সময় শেলটি চালিত প্রক্রিয়াটির পিতামাতার পিড ধারণ করে। তারপরে, উপরে যেমনটি দেখা গেছে, আইডি প্রক্রিয়াটি $PPID
মারা যায় তবে পিতামাতার প্রক্রিয়াটি পরিবর্তন হতে পারে ।
zsh
মধ্যে zsh/system
মডিউল, খোঁজ করতে পারেন বর্তমান সঙ্গে বর্তমান (উপ-) শেলের পিতা বা মাতা PID $sysparams[ppid]
। POSIX শাঁস, আপনি পেতে পারেন বর্তমান প্রক্রিয়ার ppid যে সঙ্গে অনুবাদক মৃত্যুদন্ড কার্যকর (অভিমানী এটি এখনও চলছে) ps -o ppid= -p "$$"
। এর সাথে bash
, আপনি বর্তমান (উপ-) শেলের পিপিড পেতে পারেন ps -o ppid= -p "$BASHPID"
।