PID dari proses bash child (imapsync) - bagaimana Anda mendapatkannya?

15

Adakah yang bisa memberitahu saya bagaimana cara mendapatkan PID dari perintah dieksekusi di bash.

Misalnya saya memiliki skrip bash yang menjalankan imapsync.

Ketika skrip terbunuh, proses imapsync tidak selalu terbunuh, jadi saya ingin dapat mengidentifikasi PID imapsync secara terprogram dari skrip saya, sehingga saya dapat mematikan proses imapsync sendiri di pengatur sinyal.

Jadi bagaimana cara saya mendapatkan PID dari proses anak dari script bash induk?

Jason Tan
sumber
1
Bagaimana dengan "pidof imapsync"? Apakah ada yang salah?
pitr
2
Saya tidak tahu tentang pidof. Namun sekarang yang saya lakukan, tidak berguna untuk skenario ini sejauh yang saya tahu, karena pidof tampaknya mengembalikan semua proses dari perintah yang diberikan pada sistem - bahkan yang dimiliki oleh skrip / pengguna lain. Selain itu imapsync sebenarnya adalah skrip perl, jadi saya akan melakukan perl pidof, yang lagi-lagi akan mengembalikan proses yang bukan imapsync dan mungkin milik pengguna lain.
Jason Tan
Javier benar. Halaman ini akan menawarkan informasi lebih lanjut mengenai ProcessManagement .
sinping

Jawaban:

4

imapsync memiliki opsi untuk mengatur di mana pidnya ditulis:

--pidfile: file di mana pid imapsync ditulis.

Gilles LAMIRAL
sumber
FYI ini tidak benar-benar menjawab pertanyaan saya secara umum, tapi saya menemukan argumen --pffile dan dengan beberapa faffing di sekitarnya sudah cukup baik sejauh ini ..
Jason Tan
@JasonTan mengapa mengajari pria memancing, ketika Anda bisa memberinya fillet lezat yang dimasak sebelumnya, jadi dia kembali dan mengomel Anda lebih banyak, besok, eh? maaf untuk posting lama, tetapi mengapa menerima jawaban ini atas Javier?
disinkronkan
46
any_command args &
my_child_PID=$!

TKI, seperti halnya $$memegang PID Anda, $!memiliki PID dari perintah latar belakang yang baru saja dieksekusi .

Javier
sumber
Terima kasih, tetapi imapsync tidak di latar belakang dan $! tidak diatur jika saya mengulanginya di baris berikutnya setelah pemanggilan imapsync atau baris pertama dari pengendali sinyal. :-(
Jason Tan
6
jika itu fork dan latar belakang anak, itu adalah tanggung jawab orang tua untuk menyimpan PID anak di suatu tempat. latihan yang biasa adalah menyimpannya di suatu tempat seperti /var/run/whatever.pid. Mungkin ada opsi baris perintah untuk memintanya menyimpan PID di suatu tempat; jika tidak, itu terdengar seperti fitur untuk meminta penulis, atau menerapkan sendiri.
Javier
1
Penekanan pada latar belakang . Jika tidak ada proses yang ditempatkan ke latar belakang (yaitu, dengan ditambahkan &), maka $!variabel tidak terdefinisi.
Trevor
1
Lebih banyak solusi serupa disarankan dalam (jawaban untuk) Bagaimana cara mendapatkan pid dari proses yang baru dimulai ; sebagai tambahan untuk jawaban ini, komentar di sana mengatakan: oh, dan "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 Nov '10 jam 14:28
imz - Ivan Zakharyaschev
10

Tidak seperti itu pidof, pgrepdapat diberikan berbagai opsi untuk membatasi proses yang menghasilkan PID untuknya. Salah satu yang mungkin sangat berguna adalah memilih berdasarkan pada PPID menggunakan PID dari proses saat ini.

pgrep -P $$ imapsync

yang hanya akan menampilkan PID dari imapsync jika mereka adalah anak-anak dari skrip Anda.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
0

Bagaimana dengan meletakkan imapsync di latar belakang sesaat, mendapatkan PID dan kemudian mengesampingkannya ... Sesuatu seperti ini:

imapsync &
pid=$!
wait $pid
retVal=$?
Menandai
sumber