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?
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?
Yanıtlar:
en basit yol, pgrep kullanın
crontab'da:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
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
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
pgrep myprog; if [ $? -ne 0 ]; then ...
daha iyi yazılırif ! pgrep myprog; then ...
$?
Ö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 .
Ö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
Komut dosyanızda bir kilit dosyası kullanabilirsiniz, ancak lütfen İşlem Yönetimi'ne bakın .
flock
kullanılabilecek bir yardımcı programdır.
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
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 grep
iç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.pid
ve 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.
* * * * * 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.
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