কোন প্রোগ্রাম এটি কার্যকর করেছে তা শেল স্ক্রিপ্টের জানার কোনও উপায় আছে?


13

* নিক্স ওয়ার্ল্ডে, কোন প্রোগ্রামটি কার্যকর করেছে সে সম্পর্কে শেল স্ক্রিপ্টের কোনও তথ্য থাকার উপায় আছে?


উদাহরণ:

/path/to/script1 /path/to/script_xyz

এই কাল্পনিক দৃশ্যে, script_xyzপথের তথ্য থাকবে ( /path/to/script1)

অথবা

প্রক্রিয়া পিআইডি

সত্তা যে এটি কার্যকর করেছে।

দ্রষ্টব্য: আমি বিভিন্ন সমাধান এবং পদ্ধতির বিষয়ে কৌতূহলী, আমি বাস্তবে এটি সম্ভবত সম্ভব হওয়ার আশা করি না


3
আপনার বিষয় জিজ্ঞাসা করে কোন প্রোগ্রামটি স্ক্রিপ্টটি কার্যকর করেছে। তবে আপনার আসল প্রশ্নটি স্ক্রিপ্টের দোভাষী চাইছে বলে মনে হচ্ছে । আপনার প্রশ্ন দুটি সম্পর্কে সত্যই কি?
ক্যাস্পারড

@ ক্যাস্পার্ড আপনি ঠিক বলেছেন প্রশ্ন প্রোগ্রাম সম্পর্কে ছিল, কিন্তু এটি আসলে দোভাষী। সে কারণেই আমার মনে হয়েছিল যে এটি প্রথম স্থানে সম্ভব নয়।
মিলিও ওকনোভিয়

উত্তর:


23

প্রক্রিয়া কাঁটাচামচ এবং কার্যকর করার মধ্যে প্রায়শই বিভ্রান্তি ঘটে।

আপনি যখন 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"


8

হ্যাঁ, একটি প্রোগ্রাম তার পিতামাতা কে জানতে পারে।

উদাহরণস্বরূপ, আসুন দুটি বাশ স্ক্রিপ্ট তৈরি করুন। প্রথমটি তার পিআইডি রিপোর্ট করে এবং দ্বিতীয় স্ক্রিপ্ট শুরু করে:

$ cat s1.sh
#!/bin/bash
echo s1=$$
bash s2.sh

দ্বিতীয় স্ক্রিপ্টটি তার প্রক্রিয়া আইডি, তার পিতামাতার পিআইডি এবং পিতামাতার চালনার জন্য ব্যবহৃত কমান্ড লাইনটি রিপোর্ট করে:

$ cat s2.sh
#!/bin/bash
echo s2=$$ PPID=$PPID
echo "Parent command: $(ps -o cmd= -q $PPID)"

এখন, এটি চালানো যাক:

$ bash s1.sh
s1=17955
s2=17956 PPID=17955
Parent command: bash s1.sh

আপনি দেখতে পাচ্ছেন যে দ্বিতীয় স্ক্রিপ্টটি আসলে এটির পিতামাতার পিআইডি জানে। ব্যবহার করে ps, সেই পিআইডি পিতামাতাকে অনুরোধ করতে ব্যবহৃত কমান্ড লাইনটি প্রকাশ করে।

পিপিআইডি আরও গভীরতার সাথে আলোচনার জন্য স্টাফেন চেজেলাসের উত্তর দেখুন


ধন্যবাদ। আপনার উদাহরণ স্ক্রিপ্ট আমি পেতে রানিং s1, s2এবং PPIDপরে একাধিক লাইনের মান কিন্তু তারপর, ERROR: Unsupported SysV option.ফাঁকা মান - এবং অতিরিক্ত ব্যাখ্যা এবং সঙ্গে কয়েকটি লাইনParent command
Milos Đakonović

জন আপনার প্ল্যাটফর্মে কিছু পিএস বৈশিষ্ট্য যা উপলভ্য নয় (বা ভিন্নভাবে সরবরাহ করা হয়) ব্যবহার করছে, আপনার পিএস (1) ম্যানুয়াল পৃষ্ঠাটি দেখুন।
জেসেন

@Miloshio আমি ব্যবহার উপরে পরীক্ষিত psথেকে procps-ngপ্যাকেজ, সংস্করণ 3.3.12। জেসেন যেমন পরামর্শ করেছিলেন, আপনি সম্ভবত আলাদা সংস্করণ ব্যবহার করছেন যা পিতামাতার কমান্ড লাইন মুদ্রণের জন্য আলাদা সিনট্যাক্সের প্রয়োজন হতে পারে। ব্যবহার করে দেখুন ps -f | grep $PPID
1024
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.