Çalışan işlem bittiğinde uyarı


21

Burada bir işlem tamamlandığında / sona erdiğinde uyarılmakla ilgili birkaç soru ve cevap vardır ( 1 , 2 ) - fakat bunların hepsi kullanıcının adı geçen işlemi yayınladığını varsayar ve bu sayede kullanıcının bir uyarıyla kod yazabileceğini varsayar. senaryoyu yönetin veya işlemi bir tür uyarıma yönlendirin.

Benim durumum, kullanıcımın başlatmadığı bir işlemin tamamlanmasından / çıkmasından haberdar olmak istiyorum. Yani, bir Ubuntu 12.04 LTS sunucusunda büyük video dosyalarını toplu olarak işliyorum. Bu dosyalardaki belirli işlemlerin çok uzun sürmesi nedeniyle, belirli bir işlem tamamlandığında bir tür uyarı (e-posta harika olurdu) istiyorum. O kadar uzun sürüyorlar ki, bunu bir kereye mahsus olarak, PIT'ye dayalı olarak elle yapmak tamamen iyi olacaktı.

Daha fazla bilgi vermek için - diyelim ki özellikle büyük bir dosyayı işlemden geçiriyorum ve bir FFMPEG betiğine ilerlemiş olduğunu görüyorum, işlemin kendisi bir python betiği (bu oldukça karmaşık ve kendim tarafından yazılmadı) ve Değiştirmek istemiyorum - bu ilk mantıksal yaklaşım olsa da). Belirtilen çalışan python betiğinin PID'si ile bir argüman olarak bir komut veya komut dosyası yayınlamayı hayal ediyorum ve bu PID ile işlem artık çalışmadığında, alarm komut dosyası işini yapar.

Herhangi bir fikir?


monit ( mmonit.com/monit/documentation ) potansiyel bir seçenek gibi gözükse de, ihtiyacım olandan çok daha karmaşık - umarım sadece istediğim şeyi yapmanın daha basit, daha doğrudan ve daha az şişirilmiş bir yolu olabilir .
dongle

Yanıtlar:


9

Process_watcher.py yazdım

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

Şu anda, e-posta gövdesi şuna benziyor:

PID 18851: /usr/lib/libreoffice/program/soffice.bin - writer - splash-pipe = 5
Başladı: Per, Mar 10 18:33:37 Sona erdi: Per, 10 Mar 18:34:26 (süre 0 : 00: 49)
Bellek (geçerli / en yüksek nokta) - Resident: 155,280 / 155,304 kB Sanal: 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

Herhangi bir geliştirmeye ihtiyacınız varsa GitHub sorununu ortadan kaldırın.


23

Böyle bir şey mi?

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

Değiştir $pidsüreç kimliği ile ve echo "finished"ne olursa olsun ile işlem çıkıldığı zaman yapmak istiyorum.

Örneğin:

(while kill -0 $pid; do sleep 1; done) && mail ...

Olağanüstü! ÇALIŞIYOR bir cazibe gibi.
dongle

1
Küçük (ve büyük olasılıkla açık) not - söz konusu işlem kullanıcıya ait değilse, öldürmeyi kesmek zorundadır.
dongle

1
@dongle, en azından RHEL kutumda, varolmayan pidsler ve farklı bir kullanıcının sahip olduğu pidsler için kill -0raporlar No such process, Operation not permittedbu nedenle belki de hata mesajını yorumlamak, şu gereksinimi ortadan kaldırmalıdırsudo
iruvar

1
Eğer yankı yapıyorsanız, daima echo -en "\007 \007 \007"bir terminal zili verecek olan her zaman yapabilirsiniz . Bunun gerçek bir sesli sese dönüşüp dönüşmemesi terminalinize ve donanımınıza bağlıdır (ancak genellikle yapar).
Morgon

5

&&İlki başarıyla tamamlandığında ikinci bir komutu çalıştırmak için kullanıyorum . İşte bazı örnekler:

  1. Büyük bir klasörü silin ve bip sesi:

    rm -rv ~/tmp && beep
  2. Bir çekirdek derleyin ve bir e-posta gönderin:

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

Bu probleminizi çözmenin iyi bir yolu mu? Başka bir durumda, ||başarısızlık durumunda üçüncü ve üçüncü bir komut ekleyebilirsiniz .

Ayrıca, bir kabuk betiği komutunuzun çıkış durumunu ( $?) alabilir ve if/elseve döngülerle istediğiniz şeyi yapabilirsiniz.


Teşekkürler Willian, ama dediğim gibi, kullanım davamdaki özel zorluk bunun yayınladığım bir komut değil, zaten çalışan bir işlem olduğudur. Dolayısıyla && bir seçenek değildir. Yine de teşekkürler.
dongle

4

Pid'iniz yoksa, tüm ffmpeg örnekleri bitene kadar çalışır:

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

0

Yoklama seçeneği veya harici bir komut dosyası kullanmak istemiyorsanız ve uzun süredir devam eden işleme zaten başladıysanız, bunu CTRL + Z ile askıya alabilirsiniz (SIGTSTP sinyali gönderir) ve ardından devam ettirebilirsiniz fg(işlemi taşır) ön plan).

Örneğin:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'

"... Durumum, kullanıcımın başlatmadığı bir işlemin tamamlanmasından / çıkışından haberdar olmak istiyorum."
Jeff Schaller

-1

Bir işlem sona erdiğinde Android telefonunuza bildirim gönderecek bir uygulama yaptım, böylece bilgisayarınıza bağlı kalmak zorunda kalmazsınız.

Kur, sonra ;notifier.shkomutunun sonuna ekle .

Örneğin, emriniz buysa make install getirirdiniz:

make install; notifier.sh

https://notifier.sh

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


“… Ancak bunların hepsi kullanıcının bahsedilen işlemi kendileri yayınladığını varsayıyor ve bu nedenle bunu yöneten komut dosyasına yerleşik bir uyarıyla kodlayabilir veya işlemi bir tür uyarıma yönlendirebilir. / Benim durumum, kullanıcımın başlatmayacağı bir işlemin tamamlanmasından / çıkmasından haberdar olmak istiyorum. ”
G-Man 'Monica'yı Yeniden Girin' diyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.