สคริปต์ Linux / Unix Bash รู้จัก PID ของตัวเองได้อย่างไร


149

ฉันมีสคริปต์ใน Bash ที่เรียกว่าScript.shและจำเป็นต้องรู้ PID ของตัวเอง (เช่นฉันต้องรับ PID ภายใน Script.sh)

ความคิดใด ๆ วิธีการทำเช่นนี้?

คำตอบ:



65

ใช้$BASHPIDหรือ$$

ดูคู่มือสำหรับข้อมูลเพิ่มเติมรวมถึงความแตกต่างระหว่างทั้งสอง

TL; DRTFM

  • $$ ขยายเป็น ID กระบวนการของเชลล์
    • ใน()เชลล์ย่อยมันจะขยายเป็น ID กระบวนการของเชลล์ที่เรียกใช้ไม่ใช่เชลล์ย่อย
  • $BASHPID ขยายเป็น ID กระบวนการของกระบวนการ Bash ปัจจุบัน
    • ใน()subshell นั้นจะขยายไปยัง ID กระบวนการของ subshell

10
ทำทราบว่า $$ และ BASHPID ไม่ได้เสมอในสิ่งเดียวกัน - คู่มือการกล่าวถึงนี้และมีตัวอย่างที่เป็นรูปธรรมมากขึ้นที่นี่: tldp.org/LDP/abs/html/internalvariables.html ความแตกต่างนั้นมีความสำคัญมากเนื่องจากมีการสร้าง bash จำนวนมากใน subshells
Cascabel

@Jefromi - บันทึกไว้ นั่นเป็นหนึ่งในเหตุผลที่ฉันเชื่อมโยงกับคู่มือ
tvanfosson

2
ควรสังเกตว่า$BASHPIDเป็นเรื่องใหม่สำหรับ BASH 4 หากคุณใช้ BASH 3.x คุณต้องใช้$$
Bruno Bronosky

36

นอกเหนือจากตัวอย่างที่ให้ไว้ในคู่มือการใช้สคริปต์การทุบตีขั้นสูงที่อ้างอิงโดย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

คุณช่วยอธิบายหน่อยได้ไหมว่า <<< หมายความว่าอะไร? ขอบคุณ
Sopalajo de Arrierez

4
มันเปลี่ยนเส้นทางสตริงเป็นลูป (หรืออะไรก็ได้ที่อ่านstdin) สตริงนี้เรียกว่า "here string"
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

8

$$หมายเลขผลิตภัณฑ์ถูกเก็บไว้ใน

ตัวอย่าง: kill -9 $$จะฆ่าเชลล์อินสแตนซ์ที่ถูกเรียกจาก


kill -9(พร้อม-9ธง) ถือเป็นอันตรายและใช้เฉพาะเมื่อจำเป็นจริงๆเท่านั้น)
Willem Van Onsem

3
มันถือว่าเป็น "อันตราย" เพราะกระบวนการไม่ได้รับโอกาสตอบสนองต่อสัญญาณ (และอาจทำความสะอาดตัวเอง) ทำkill -9 $$สิ่งที่แน่นอน 1 มันฆ่ากระบวนการเปลือกปัจจุบัน สิ่งนี้มีประโยชน์ถ้าคุณทำบางสิ่งในเชลล์เซสชันที่คุณไม่ต้องการเขียนถึง.bash_historyLike:docker run -e PASSWORD=hunter2 ircbot
Bruno Bronosky


0

หากกระบวนการเป็นกระบวนการลูกและไม่ได้ตั้งค่า $ BASHPID เป็นไปได้ที่จะสืบค้น ppid ของกระบวนการลูกที่สร้างขึ้นของกระบวนการทำงาน มันอาจจะดูน่าเกลียด แต่ก็ใช้ได้ ตัวอย่าง:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.