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?

DerMike
sumber
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
2
Silakan lihat Manajemen Proses .
Dijeda sampai pemberitahuan lebih lanjut.

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.

Jeremy Sturdivant
sumber
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.

pengguna1686
sumber