cron: bir işlem yürütüyor ama sadece çalışmıyorsa?


11

Benim için cron'a bir uygulama çalıştırmasını söylememin bir yolu var, ancak bir işlem zaten mevcutsa çalıştırmıyor mu?

linux  cron 

Uygulamanın zaten çalışıyorsa veya farklı bir işlem zaten çalışıyorsa çalışmaması gerektiğini açıklar mısınız? Teşekkürler
Linker3000

Yanıtlar:


23

en basit yol, pgrep kullanın

crontab'da:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

Bu cevabın sadeliğini seviyorum. Bilginize, -f bayrağını pgrep'e ekleyebilmeniz gerekir ve daha sonra işlemin bağımsız değişkenlerini koşulunuzun bir parçası olarak incelemek istiyorsanız yararlı olan tam işlem adını kontrol edebilirsiniz.
Craig Sefton

6
Hayır, -f bayrağını cronjob içinde pgrep ile kullanamazsınız. Bunun nedeni, cronjob'un kendisini çalıştırmak için kullanılan kabuk betiğiyle eşleşmenizdir.
CpnCrunch

Cron ile bir GUI işlemi çalıştırırken, hataları export DISPLAY=:0önlemek için ile başa getirin Could not connect to display. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Benjam

9

Doğrudan program yerine bir komut dosyası çalıştırın. Birçok olasılık var. Örneğin :

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi

1
FYI - argüman listelerini saklamak için skaler değişkenlerin kullanılması kötü uygulama olarak kabul edilir. Başarısız olduğu bir durum örneği için bkz. Mywiki.wooledge.org/BashFAQ/050 .
Charles Duffy

... benzer şekilde, pgrep myprog; if [ $? -ne 0 ]; then ...daha iyi yazılırif ! pgrep myprog; then ...
Charles Duffy

... bu sonuncu stil sadece daha okunabilir değil, aynı zamanda hataya daha az yatkındır: $?Örneğin, günlük mesajları ekleyerek veya satırlar arasında hata işleme ile kasıtsız olarak değerini bozmak kolaydır .
Charles Duffy

7

Önceki örnek tamamlanmadıysa bu komut dosyası yeniden çalışmaz. Başka bir özel işlem çalışıyorsa bir şey çalıştırmak istemiyorsanız, harrymc'nin komut dosyasına bakın.

DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;

if flock -n -x 8; then
  echo ""
  echo "Starting your script..."
  echo ""

[PUT YOUR STUFF HERE]

  echo ""
  echo "Script started  $DATE";
  echo "Script finished `date +%c`";
else
  echo "Script NOT started - previous one still running at $DATE";
fi

3

Komut dosyanızda bir kilit dosyası kullanabilirsiniz, ancak lütfen İşlem Yönetimi'ne bakın .

flock kullanılabilecek bir yardımcı programdır.


İyi bir! şimdi rsync bu yavaş çizgi üzerinden, müşteri müdahalesi manuel müdahale olmadan on line gelen 5 dakika içinde ateş, her zaman alabilir:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

Bu genellikle tarafından değil, programın kendisi tarafından ele alınır cron. Bunun için iki standart teknik vardır:

1) Bu adda zaten çalışan bir işlem olup olmadığını görmek grepiçin çıktıps

2) Başlangıçta, genellikle pid (işlem kimliği) dosyasının varlığını kontrol edin, genellikle adresinde /var/run/program_name.pidve varsa, pid'i dosyadan okuyun ve bu işlemin hala devam edip etmediğini kontrol edin; eğer öyleyse, başlamayı reddedin. Pid dosyası yoksa veya dosyadaki pid kaybolursa, bir pid dosyası oluşturun, işlem kimliğinizi buraya yazın ve normal başlatma ile devam edin.

Bunlardan herhangi birini doğrudan crontab'ınıza yapacak olan bash boruları yazmak teknik olarak mümkün olsa da, bunları başlatılan programa eklemek daha iyidir (böylece nasıl başlatılırsa uygularlar) veya harrymc'nin önerdiği gibi bunu halledin.


0

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

Yukarıdaki cevabı desen eşleşmesinde bir iyileşme ile tekrar kullandım. f seçeneği olmayan pgrep, işlem modeliyle eşleşmiyor. Yine de f seçeneğini kullanmayla ilgili bir sorun var. F seçeneğiyle, cron'u üreten kabuk her zaman eşleşir ve pid'ini döndürür, bu nedenle işlem asla yeniden başlatılmaz.

Harf desenlerinden birinin etrafına [] eklenmesi yalnızca işlemle eşleşir ve cron kabuğu pid'i döndürülmez.


0

Dokümanlar: https://www.timkay.com/solo/

solo, bir programın aynı anda birden fazla kopya çalıştırmasını engelleyen çok basit bir komut dosyasıdır (10 satır). Önceki iş bitmeden bir işin çalışmadığından emin olmak için cron ile kullanışlıdır.

Misal

* * * * * solo -port=3801 ./job.pl blah blah
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.