Tulis file PID secara manual dari skrip Bash


10

Bagaimana saya bisa menulis skrip Bash yang menjalankan program yang berjalan lama dan menyimpan id proses program dalam file terpisah?

Saya menginginkan sesuatu seperti

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

Namun melakukan hal ini akan mengeksekusi alatps setelah selesai.

Apakah ada cara untuk mendapatkan id proses dari proses yang dibuat?


2
Kode sampel Anda tidak akan berfungsi karena exec tidak membayar, jadi proses shell digantikan oleh long_running_toolproses. Akibatnya, eksekutif tidak pernah kembali dan baris berikut tidak pernah tercapai. Lihat help exec, execve(2).
Etienne Dechamps

@ e-t172 terima kasih telah menunjukkan. Saya menghapus 'exec' lalu.
DerMike

Jawaban:


12

Anda dapat dengan mudah menjalankan proses di latar belakang dengan "&", lalu mendapatkan PID dari proses latar belakang menggunakan "$!"

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

Kemudian, secara opsional, tunggu $! jika Anda ingin shell untuk memblokir sampai proses menyelesaikan eksekusi.


1
UPDATE: ketika saya menggunakan fg saya mendapatkan 'fg: 21: job (null) tidak dibuat di bawah kontrol pekerjaan' dan skrip tidak memblokir. Maaf.
DerMike

"tunggu $!" harus memiliki efek yang mirip dengan fg yang bisa saya konfirmasi sebenarnya, bekerja dalam skrip. Saya mungkin harus memeriksa itu sebelum memposting. >.> salahku.
Jeremy Sturdivant

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

Seperti disebutkan sebelumnya, exec menggantikan bash dengan program yang ditentukan, mempertahankan PID.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.