ฉันมีสคริปต์ใน Bash ที่เรียกว่าScript.sh
และจำเป็นต้องรู้ PID ของตัวเอง (เช่นฉันต้องรับ PID ภายใน Script.sh)
ความคิดใด ๆ วิธีการทำเช่นนี้?
ฉันมีสคริปต์ใน Bash ที่เรียกว่าScript.sh
และจำเป็นต้องรู้ PID ของตัวเอง (เช่นฉันต้องรับ PID ภายใน Script.sh)
ความคิดใด ๆ วิธีการทำเช่นนี้?
คำตอบ:
ตัวแปร '$$' มี PID
ใช้$BASHPID
หรือ$$
ดูคู่มือสำหรับข้อมูลเพิ่มเติมรวมถึงความแตกต่างระหว่างทั้งสอง
TL; DRTFM
$$
ขยายเป็น ID กระบวนการของเชลล์
()
เชลล์ย่อยมันจะขยายเป็น ID กระบวนการของเชลล์ที่เรียกใช้ไม่ใช่เชลล์ย่อย$BASHPID
ขยายเป็น ID กระบวนการของกระบวนการ Bash ปัจจุบัน
()
subshell นั้นจะขยายไปยัง ID กระบวนการของ subshell$BASHPID
เป็นเรื่องใหม่สำหรับ BASH 4 หากคุณใช้ BASH 3.x คุณต้องใช้$$
นอกเหนือจากตัวอย่างที่ให้ไว้ในคู่มือการใช้สคริปต์การทุบตีขั้นสูงที่อ้างอิงโดยJefromiตัวอย่างเหล่านี้ยังแสดงให้เห็นว่าไพพ์สร้างท่อย่อยได้อย่างไร:
$ 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
stdin
) สตริงนี้เรียกว่า "here string"
$$
หมายเลขผลิตภัณฑ์ถูกเก็บไว้ใน
ตัวอย่าง: kill -9 $$
จะฆ่าเชลล์อินสแตนซ์ที่ถูกเรียกจาก
kill -9
(พร้อม-9
ธง) ถือเป็นอันตรายและใช้เฉพาะเมื่อจำเป็นจริงๆเท่านั้น)
kill -9 $$
สิ่งที่แน่นอน 1 มันฆ่ากระบวนการเปลือกปัจจุบัน สิ่งนี้มีประโยชน์ถ้าคุณทำบางสิ่งในเชลล์เซสชันที่คุณไม่ต้องการเขียนถึง.bash_history
Like:docker run -e PASSWORD=hunter2 ircbot
คุณสามารถใช้$$
ตัวแปร
หากกระบวนการเป็นกระบวนการลูกและไม่ได้ตั้งค่า $ BASHPID เป็นไปได้ที่จะสืบค้น ppid ของกระบวนการลูกที่สร้างขึ้นของกระบวนการทำงาน มันอาจจะดูน่าเกลียด แต่ก็ใช้ได้ ตัวอย่าง:
sleep 1 &
mypid=$(ps -o ppid= -p "$!")