เขียนไฟล์ PID ด้วยตนเองจาก Bash script


9

ฉันจะเขียน Bash-script ที่รันโปรแกรมที่รันเป็นเวลานานและจัดเก็บ id กระบวนการของโปรแกรมไว้ในไฟล์แยกกันได้อย่างไร

ฉันต้องการบางสิ่งบางอย่าง

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

อย่างไรก็ตามการทำเช่นนี้จะดำเนินการpsหลังจากเครื่องมือเสร็จสิ้น

มีวิธีรับรหัสกระบวนการของกระบวนการที่สร้างขึ้นหรือไม่


2
โค้ดตัวอย่างของคุณจะไม่ทำงานเพราะ exec ไม่แยกดังนั้นกระบวนการเชลล์จะถูกแทนที่ด้วยlong_running_toolกระบวนการ ดังนั้น exec จะไม่ส่งคืนและไม่ถึงบรรทัดต่อไปนี้ ดู,help exec execve(2)
Etienne Dechamps

@ e-t172 ขอบคุณสำหรับการชี้ให้เห็น ฉันลบ 'exec' แล้ว
DerMike

2
โปรดดูการจัดการกระบวนการ
Dennis Williamson

คำตอบ:


12

คุณสามารถเรียกใช้กระบวนการในพื้นหลังได้อย่างง่ายดายด้วย "&" จากนั้นรับ PID ของกระบวนการพื้นหลังโดยใช้ "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

จากนั้นเลือกรอ $! หากคุณต้องการให้เชลล์บล็อกจนกว่ากระบวนการจะเสร็จสิ้นการดำเนินการ


1
UPDATE: เมื่อฉันใช้ fg ฉันได้รับ 'fg: 21: job (null) ไม่ได้สร้างภายใต้การควบคุมงาน' และสคริปต์จะไม่บล็อก ขอโทษ
DerMike

"รอ $!" ควรมีผลคล้ายกับ fg ที่ฉันสามารถยืนยันได้จริง ๆ แล้วทำงานในสคริปต์ ฉันควรตรวจสอบก่อนโพสต์ >.> ฉันไม่ดี
Jeremy Sturdivant

8
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

ดังกล่าวก่อนหน้านี้exec แทนที่ bashด้วยโปรแกรมที่ระบุรักษา PID

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