Apakah ada cara untuk mendengarkan proses?

9

Saya ingin tahu apakah ada cara untuk mendengarkan proses di Linux & unix - kapan berakhir dan apa kode keluar dari proses (skrip).

Saya tidak ingin menulis skrip yang akan berjalan Xdetik dan memeriksa ps -ef | grep PIDapakah prosesnya masih hidup. Saya ingin tahu apakah ada cara agar proses akan memberi tahu saya kapan berakhir dan apa kode keluarnya.

Nir
sumber

Jawaban:

3

Bash melakukan ini untukmu. Ini akan memberi tahu Anda ketika proses berakhir dengan memberikan Anda kontrol kembali dan itu akan menyimpan status keluar dalam variabel khusus $?. Ini terlihat seperti ini:

someprocess
echo $?

Lihat manual bash tentang parameter khusus untuk informasi lebih lanjut.

Tapi saya berasumsi bahwa Anda ingin melakukan pekerjaan lain sambil menunggu. Di bash kamu bisa melakukan itu seperti ini:

someprocess &
otherwork
wait %+
echo $?

someprocess &akan memulai proses di latar belakang. Itu berarti kontrol akan segera kembali dan Anda dapat melakukan pekerjaan lain. Proses yang dimulai di latar belakang disebut pekerjaan di bash. waitakan menunggu pekerjaan yang diberikan selesai dan kemudian mengembalikan status keluar dari pekerjaan itu. Pekerjaan direferensikan oleh %n. %+mengacu pada pekerjaan terakhir dimulai. Lihat manual bash tentang kontrol pekerjaan untuk informasi lebih lanjut.

Jika Anda benar-benar membutuhkan PID, Anda juga dapat melakukannya seperti ini:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! adalah variabel khusus yang berisi PID dari proses latar belakang yang terakhir dimulai.

lesmana
sumber
Dan bagaimana cara waitkerjanya? Berapa banyak CPU yang biasanya akan diambil dari sistem?
Nir
1
Saya tidak tahu bagaimana tepatnya bash waitbekerja. Saya tahu bahwa itu tidak membutuhkan jumlah sumber daya sistem yang nyata. Anda dapat meninjau kode sumber di sini: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
lesmana
6

Satu - pendekatan yang tidak dapat disangkal - adalah menggunakan strace:

$ strace -e trace=none -e signal=none -p 12345

akan menonton proses dengan PID 12345, memotong tidak ada panggilan sistem (pertama -e) dan tidak ada sinyal (kedua -e). Setelah proses keluar secara teratur, nilai keluar akan dicetak.

Jika proses diakhiri oleh sinyal, strace keluar secara diam-diam (saat dijalankan dengan opsi yang diberikan di atas). Anda dapat menggunakan mis -e signal=killuntuk mengubah perilaku ini. Perhatikan, bagaimanapun, bahwa -e signal=all(atau, secara ekuivalen, menghilangkan -e signalopsi) dapat menghasilkan sejumlah besar output jika sinyal diterima dan ditangani oleh program.

Ansgar Esztermann
sumber
4
  1. Merantai eksekusi "beri tahu"

    $ process; notify $? &

    Perhatikan bahwa jika proses akan keluar dengan cara yang notifytidak terduga tidak akan dieksekusi

  2. Menyiapkan perangkap

    Proses ditandai oleh sinyal-sinyal dari makna yang berbeda dan dapat bereaksi dengan tepat

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

Anda tidak jelas pemberitahuan apa yang ada dalam pikiran Anda. Intinya bisa apa saja yang berdering "bel" tentu saja. Satu untuk banyak orang misalnya. notify-senddari libnotifyperpustakaan.

$ process; notify-send "process finished with status $?" &
Miroslav Koškár
sumber
1

Dengan ptrace()Anda dapat melampirkan pelacak ke suatu proses (atau menjalankan yang baru), mengatur pengait dengan PTRACE_O_TRACEEXIT(linux> = 2.5.60) dan tidur sampai proses keluar, kemudian dengan PTRACE_GETEVENTMSGmendapatkan status keluar.

Di sini contoh implementasi disebut stopper , saya memeriksanya dengan attachopsi saja dan diperlukan beberapa perubahan untuk membuatnya bekerja (akhirnya jika diperlukan saya akan memposting kode di suatu tempat).

Alex
sumber