Peringatan saat menjalankan proses selesai

21

Ada beberapa pertanyaan dan jawaban di sini berkenaan dengan disiagakan ketika suatu proses menyelesaikan / keluar ( 1 , 2 ) - tetapi ini semua menganggap bahwa pengguna telah mengeluarkan proses tersebut sendiri, dan dengan demikian dapat skrip dengan peringatan yang dibangun ke dalam skrip yang mengatur, atau pipa proses ke semacam peringatan.

Situasi saya adalah bahwa saya ingin diberitahu tentang penyelesaian / keluar dari proses yang tidak diinisialisasi oleh pengguna saya. Yaitu, saya sedang memproses file video besar di server Ubuntu 12,04 LTS. Operasi tertentu pada file-file ini membutuhkan waktu yang sangat lama, jadi saya ingin beberapa jenis peringatan (email akan bagus) ketika yang spesifik selesai. Mereka butuh waktu lama, sehingga melakukan ini satu kali, secara manual, berdasarkan PIT akan baik-baik saja.

Untuk memberikan lebih banyak info - katakanlah saya sedang memproses file yang sangat besar, dan saya melihat bahwa itu telah berkembang menjadi skrip FFMPEG, prosesnya sendiri menjadi skrip python (yang cukup rumit, dan tidak ditulis sendiri, dan sesuatu Saya tidak ingin memodifikasi - meskipun itu akan menjadi pendekatan logis pertama). Saya membayangkan mengeluarkan perintah atau skrip dengan PID dari kata menjalankan skrip python sebagai argumen, dan ketika proses dengan PID tidak lagi berjalan, skrip waspada melakukan hal itu.

Ada ide?

dongle
sumber
monit ( mmonit.com/monit/documentation ) sepertinya merupakan opsi yang potensial, tetapi jauh lebih kompleks daripada yang saya butuhkan - berharap mungkin ada cara yang lebih sederhana, lebih langsung, dan tidak terlalu kembung dalam melakukan hanya apa yang saya minta, dan tidak ada lagi .
dongle

Jawaban:

9

Saya menulis process_watcher.py

process_watcher --pid 1234 --to me@gmail.com

Saat ini, badan email terlihat seperti:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Dimulai: Kam, 10 Mar 18:33:37 Berakhir: Kam, 10 Mar 18:34:26 (durasi 0 : 00: 49)
Memori (saat ini / puncak) - Penduduk: 155.280 / 155.304 kB Virtual: 1.166.968 / 1.188.216 kB

[+] indicates the argument may be specified multiple times, for example:
 process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to person1@domain.com --to person2@someplace.com

optional arguments:
  -h, --help            show this help message and exit
  -p PID, --pid PID     process ID(s) to watch [+]
  -c COMMAND_PATTERN, --command COMMAND_PATTERN
                        watch all processes matching the command name. (RegEx pattern) [+]
  -w, --watch-new       watch for new processes that match --command. (run forever)
  --to EMAIL_ADDRESS    email address to send to [+]
  -n, --notify          send DBUS Desktop notification
  -i SECONDS, --interval SECONDS
                        how often to check on processes. (default: 15.0 seconds)
  -q, --quiet           don't print anything to stdout

Hentikan masalah GitHub jika Anda membutuhkan perbaikan.

Arlo
sumber
23

Sesuatu seperti ini?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

Ganti $piddengan id proses dan echo "finished"dengan apa pun yang ingin Anda lakukan ketika proses keluar.

Sebagai contoh:

(while kill -0 $pid; do sleep 1; done) && mail ...
kekacauan
sumber
Fenomenal! Bekerja seperti pesona.
dongle
1
Catatan kecil (dan mungkin jelas) - ketika proses tersebut tidak dimiliki oleh pengguna, harus sudo kill.
dongle
1
@ dongle, setidaknya di kotak RHEL saya, kill -0laporan No such processuntuk tidak ada pids dan Operation not permitteduntuk pids yang dimiliki oleh pengguna yang berbeda jadi mungkin menafsirkan pesan kesalahan harus meniadakan kebutuhan untuksudo
iruvar
1
Jika Anda menggema, Anda selalu bisa echo -en "\007 \007 \007", yang akan mengeluarkan 'lonceng' terminal. Apakah itu diterjemahkan menjadi suara yang dapat didengar sebenarnya tergantung pada terminal dan perangkat keras Anda (tetapi biasanya demikian).
Morgon
5

Saya menggunakan &&untuk menjalankan perintah kedua ketika yang pertama selesai dengan sukses. Berikut beberapa contoh:

  1. Hapus folder besar dan bunyi bip:

    rm -rv ~/tmp && beep
  2. Kompilasi kernel dan kirim email:

    make && mail -s "Compilation is done" user@yourmaildomain.com

Apakah ini cara yang baik untuk menyelesaikan masalah Anda? Dalam kasus lain, Anda bisa menambahkan ||perintah ketiga dan jika terjadi kegagalan.

Juga, skrip shell dapat menerima status keluar ( $?) dari perintah Anda, dan dengan if/elsedan loop Anda dapat melakukan apa pun yang Anda inginkan.

Willian Paixao
sumber
Terima kasih Willian, tetapi seperti yang saya katakan, tantangan khusus dalam kasus penggunaan saya adalah bahwa ini bukan perintah yang saya keluarkan, tetapi proses yang sudah berjalan. Jadi && bukanlah suatu pilihan. Bagaimanapun, terima kasih.
dongle
4

Jika Anda tidak memiliki pid, ini akan berjalan sampai semua instance ffmpeg selesai:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
pengguna82927
sumber
0

Jika Anda tidak ingin menggunakan opsi polling atau skrip eksternal, dan Anda sudah memulai proses yang sudah berjalan lama, Anda dapat menangguhkannya dengan CTRL + Z (mengirim sinyal SIGTSTP) dan kemudian melanjutkan dengan fg(memindahkan proses ke latar depan).

Sebagai contoh:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
Benjamin
sumber
Kecuali ... "Situasi saya adalah saya ingin diberitahu tentang penyelesaian / keluar dari proses yang tidak diinisialisasi oleh pengguna saya."
Jeff Schaller
-1

Saya membuat aplikasi yang akan mengirimkan pemberitahuan ke ponsel Android Anda ketika proses berakhir sehingga Anda tidak perlu ditambatkan ke komputer Anda.

Instal, lalu tambahkan ;notifier.shke akhir perintah Anda.

Misalnya, jika perintah Anda adalah make install, Anda akan membuat perintah Anda:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

Jolt151
sumber
"... tapi ini semua menganggap bahwa pengguna telah mengeluarkan proses kata sendiri, dan dengan demikian dapat skrip dengan peringatan yang dibangun ke dalam skrip yang mengatur, atau pipa proses ke semacam peringatan. / Situasi saya adalah bahwa saya ingin diberitahu tentang penyelesaian / keluar dari proses yang tidak diinisialisasi oleh pengguna saya. "
G-Man Mengatakan 'Reinstate Monica'