มักมีความสับสนระหว่างการฟอร์กกระบวนการและการดำเนินการ
เมื่อคุณทำตามคำสั่งของbash
เชลล์
$ sh -c 'exec env ps'
กระบวนการP1 ที่ออก$
พรอมต์นั้นกำลังเรียกใช้bash
รหัสในปัจจุบัน นั่นbash
รหัสส้อมกระบวนการใหม่P2ที่รัน/bin/sh
ซึ่งจากนั้นจะดำเนินการที่แล้วรัน/usr/bin/env
/bin/ps
ดังนั้นP2ได้ในการเปิดดำเนินการของรหัสbash
, sh
, และenv
ps
ps
(หรือคำสั่งอื่น ๆ เช่นสคริปต์ที่เราจะใช้แทนที่นี่) ไม่มีทางที่จะรู้ว่ามันถูกใช้งานโดยenv
คำสั่ง
ทั้งหมดก็สามารถทำได้คือการหาสิ่งที่กระบวนการ id แม่เป็นซึ่งในกรณีนี้จะเป็นได้ทั้งP1หรือ1
ถ้าP1ได้ตายในช่วงเวลาหรือบนลินุกซ์กระบวนการอื่นที่ได้รับการกำหนดให้เป็นsubreaper1
แทน
จากนั้นสามารถสืบค้นระบบสำหรับคำสั่งที่กระบวนการกำลังทำงานอยู่ (เช่นเดียวกับreadlink /proc/<pid>/exe
บน Linux) หรืออาร์กิวเมนต์ใดที่ส่งผ่านไปยังคำสั่งสุดท้ายที่เรียกใช้งาน (เช่นเดียวกับ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
ใน POSIX เชลล์$PPID
จะประกอบด้วย pid ของพาเรนต์ของกระบวนการที่ดำเนินการเชลล์ในเวลาที่การเริ่มต้นเชลล์นั้น หลังจากนั้นตามที่เห็นด้านบนกระบวนการผู้ปกครองอาจเปลี่ยนแปลงหากกระบวนการของ id $PPID
ตาย
zsh
ในzsh/system
โมดูลสามารถสอบถามปัจจุบัน pid แม่ของปัจจุบัน (ย่อย) $sysparams[ppid]
เปลือก ในเปลือกหอย POSIX, คุณจะได้รับในปัจจุบัน PPID ของกระบวนการที่ดำเนินการล่าม (สมมติว่ามันยังทำงานอยู่) ps -o ppid= -p "$$"
กับ ด้วยbash
คุณจะได้รับ PPID ของปัจจุบัน (ย่อย) ps -o ppid= -p "$BASHPID"
เปลือกกับ