วิธีรับ pid ของคำสั่งที่ดำเนินการครั้งสุดท้ายในเชลล์สคริปต์?


254

ฉันต้องการมีเชลล์สคริปต์เช่นนี้:

my-app &
echo $my-app-pid

แต่ฉันไม่ทราบวิธีการรับ pid ของคำสั่งที่ดำเนินการเพียง

ฉันรู้ว่าฉันสามารถใช้jobs -p my-appคำสั่งเพื่อ grep pid แต่ถ้าฉันต้องการรันเชลล์หลาย ๆ ครั้งวิธีนี้จะไม่ทำงาน เพราะjobspecไม่ชัดเจน

คำตอบ:


338

PID ของคำสั่งที่ดำเนินการล่าสุดอยู่ใน$!ตัวแปรเชลล์:

my-app &
echo $!

1
มันกำลังพิมพ์ pid สำหรับเช่น [1] 893 ฉันต้องการตัวเลขเท่านั้น
user3153014

33
มันควรจะตั้งข้อสังเกตว่านี้ยืนสำหรับโปรแกรมเริ่มต้นในพื้นหลัง หากไม่มีการเริ่มต้นกระบวนการส่วนหลังพารามิเตอร์จะไม่ถูกตั้งค่า
ramrunner

5
วิธีการแก้ปัญหาที่เพิ่งเริ่มต้น : โอ้และ "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 พ.ย. 53 เวลา 14:28
imz - Ivan Zakharyaschev

14
@ user3153014 สตริง s like "[2] 2625" ถูกพิมพ์โดย shell หลังจากเริ่มงานพื้นหลัง สิ่งนี้ไม่เกี่ยวข้องกับผลลัพธ์ของecho $!
Petr Gladkikh

ฉันมักจะใช้รหัสดังกล่าวในสคริปต์เมื่อฉันต้องรอจนกว่ากระบวนการจะสิ้นสุดลง my-app & myVar=$! ; fg. fgนำกระบวนการกลับมาทำงานอีกครั้ง ฉันสามารถพิมพ์ได้ในecho $myVarภายหลังและฉันค่อนข้างมั่นใจว่าแอพของฉันได้ดำเนินการเสร็จสิ้นแล้ว
Vrata Blazek

66

รับPID:

#!/bin/bash
my-app &
echo $!

บันทึกPIDในตัวแปร:

#!/bin/bash
my-app &
export APP_PID=$!

บันทึกทุกอินสแตนซ์PIDในไฟล์ข้อความ:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

บันทึกผลลัพธ์ข้อผิดพลาดและPIDในไฟล์แยก:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"

3
คำถามไม่ได้ถามเกี่ยวกับการเปลี่ยนเส้นทางจากนั้นคำตอบของคุณจะเหมือนกันกับคำตอบที่ยอมรับยกเว้นว่าถ้าอินสแตนซ์ของการmy-appเสร็จสิ้นและอาจแย่กว่านั้น PID ของมันจะถูกนำมาใช้ซ้ำในภายหลังคุณจะมีข้อมูลที่ไม่ดี ฉันไม่คิดว่าคำตอบนี้จะเพิ่มคุณค่าให้กับคำตอบที่ได้รับการยอมรับในปัจจุบันจริงๆ
Eric Renouf

@EricRenouf อัปเดตโพสต์แล้ว!
Eduardo Cuomo

อนุพันธ์อีกอันที่อาจมีประโยชน์ สิ่งนี้จะได้รับ PID และในเวลาเดียวกันถือว่าเป็นกระบวนการพื้นหน้า (ส่วนใหญ่): sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe

isnt APP = main &วิธีคว้า PID หรือไม่
MrMesees

3

ลองสิ่งที่ชอบ

pidof my_app >> /tmp/my_app.pid

1
คำสั่งภายนอกและช้าถ้าระบบสามารถให้ PID ได้โดยตรงว่าทำไมค้นหาผ่านกระบวนการทั้งหมดเพื่อค้นหาสิ่งนั้น และยังไม่แน่ใจว่าคุณจะได้รับค่าที่ถูกต้อง
papo

-4

ลองสิ่งนี้:

 ps ef | grep "[m]y-app" | awk '{print $2}'

การวางอักษรตัวแรกของกระบวนการของคุณระหว่าง[ ]ทำให้แน่ใจว่าคุณไม่ได้รับgrepกระบวนการในรายการของคุณ หากจำเป็นคุณสามารถเพิ่ม grep ในชื่อผู้ใช้ของคุณ


9
มันเปราะบางที่สุดและไม่ทำงานหากmy-appถูกสั่งการมากกว่าหนึ่งครั้ง - davidshen84กังวลเฉพาะเกี่ยวกับคาสิโนนั้น ๆ
จ้า

2
หากคุณใช้เส้นทางนี้คุณควรใช้pgrepแทน
วิลเล็ม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.