Bir betiği cron tarafından yeniden başlatılana kadar belirli bir zamanda nasıl durdurabilirim?


12

OSMC (Debian tabanlı) çalıştıran bir Raspberry Pi var.

Bir scronu başlatmak için bir cron işi ayarladım, sync.sh, gece yarısı.

0 0 * * * /usr/local/bin sync.sh

Senaryoyu 7'de durdurmam gerekiyor. Şu anda kullanıyorum:

0 7 * * * shutdown -r now

Daha iyi bir yol var mı? Yeniden başlatmanın aşırı dolu olduğunu hissediyorum.

Teşekkürler

Yanıtlar:


25

Sen ile çalıştırabilirsiniz timeoutkomutu ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

PS. Senkronizasyon işleminiz çok fazla zaman alıyorsa, verilerinizi senkronize etmek için farklı bir yaklaşım düşünebilirsiniz, belki de çoğaltmayı engelleyebilirsiniz.


İnternet bağlantım yavaş olduğundan senkronizasyon neden bu kadar uzun sürüyor. Belirli bir sinyal tavsiye eder misiniz?
Anthony

@ Anthony şu anda nasıl senkronize ediyorsunuz?
Rabin



@Anthony , senkronize edilecek dosyanın blok düzeyinde çalışan senkronizasyon ( syncthing.net ) veya BTSync ( resilio.com ) gibi diğer uygulamaları deneyebilirsiniz
Rabin

9

Senkronizasyonunuz 17 saatlik hazırda bekletme modundan sonra kolayca devam ederse,

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

Senkronizasyonunuz baştan başlamayı tercih ederse, deneyin

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

Senkronizasyonunuz veya alt görevleriniz sinyalleri yok sayar, ancak enkaz bırakmazsa,

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc


Aşağıda bulunan komut dosyasını kullanıyorum, mirror -c ile yeniden başlatılmasının akla gelmediği görülüyor. Yukarıdakilerden hangisini önerirsiniz ?
Anthony

Kilit dosyasını temizlemek için bir SIGTERM isteyen LFTP betiğini gören ve 17 boşta saatte veya daha da kötüsü inet [64] yeniden numaralandırmalarda sunucu zaman aşımı olasılığını göz önünde bulundurarak, en 0 0 * * * timeout 7h /usr/local/bin/sync.shçok eşdeğer killall -TERMvaryantı seçerim.
Roman Czyborra

4

Ayrıca belirli bir zamanda bu hizmeti veya komut dosyasını "durdurmak" veya "öldürmek" için cron kullanırdım.
Önce işinizi veya komut dosyanızı çalıştırmak için cron işinizi oluşturun. (adı olan bir işi öldürecek başka bir cronu kolayca çalıştırabilirsiniz sudo pkill wget)

İkinci olarak, crontab görevlerinin yararlı ve okunabilir bir formatta çalışmasını aşağıdakilerin çıktısında görmek istersiniz:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

İlk satırlarda görünecekler, şöyle:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

İlk sütun PID, ikincisi Oturum Kimliği ve üçüncüsü cron tarafından başlatılan komuttur. Oturum Kimliğini kullanarak belirli bir cron göreviyle ilgili tüm işlemleri öldürebilirsiniz, bu nedenle yukarıdaki örnekte Oturum Kimliği 4289'u öldürmelisiniz:

   pkill -s 4289

Pkill'i bir senaryoya koymanız ve bunu bir cron olarak çalıştırmanız gerekiyor


Cron işi her çalıştığında Oturum Kimliği değişecek mi? Güç kapatılıp açıldıktan sonra ne olacak?
Anthony

evet değişecek. Ancak, komut dosyasını yazarsanız, PID'yi alabilir ve bir değişkene yerleştirebilirsiniz. Görünüyorsa adı kullanabilirsiniz. pkill sync.sh
ddlingo
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.