cron: запустити процес, але тільки якщо він не працює?


11

Чи є спосіб мені сказати cron запускати додаток, але НЕ запускати його, якщо процес вже існує?

linux  cron 

Чи уточнили б ви, чи програма не запускається, якщо вона вже запущена чи інший процес вже запущений. Спасибі
Linker3000

Відповіді:


23

найпростіший спосіб - використовувати pgrep

у crontab:

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

Любіть простоту цієї відповіді. FYI, ви повинні мати змогу додати прапор -f до pgrep, а потім можете перевірити повне ім'я процесу, що корисно, якщо ви також хочете перевірити аргументи процесу як частину вашої умови.
Крейг Сефтон

6
Ні, ви не можете використовувати прапор -f з pgrep всередині cronjob. Причина полягає в тому, що ви будете відповідати скрипту оболонки, який використовується для запуску самого cronjob.
CpnCrunch

Під час запуску GUI-процесу з cron, передбачте, export DISPLAY=:0щоб запобігти Could not connect to displayпомилкам. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Бенджам

9

Запустіть сценарій, а не безпосередньо програму. Є багато можливостей. Наприклад :

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 - використання скалярних змінних для зберігання списків аргументів вважається поганою практикою. Див. Mywiki.wooledge.org/BashFAQ/050 для прикладу випадку, коли він не працює.
Чарльз Даффі

... аналогічно, pgrep myprog; if [ $? -ne 0 ]; then ...було б краще записати якif ! pgrep myprog; then ...
Чарльз Даффі

... цей останній стиль є не тільки більш читабельним, але й менш схильним до помилок: легко ненавмисно порушити значення $?, наприклад, додавши повідомлення журналу чи обробку помилок між рядками.
Чарльз Даффі

7

Цей сценарій не запуститься знову, якщо попередній екземпляр не закінчився. Якщо ви хочете щось не запустити, якщо інший конкретний процес запущений, див. Сценарій harrymc.

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

Ви можете використовувати файл блокування у своєму сценарії, але, будь ласка, див. Управління процесами .

flock є однією утилітою, яку можна використовувати.


хороший! тепер rsync за цією повільною лінією може зайняти весь час, який їй потрібен, стріляючи протягом 5 хвилин, коли хост клієнта вийшов на лінію без ручного втручання:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

Зазвичай цим займається сама програма, а не сама програма cron. Для цього є дві стандартні методики:

1) grepвисновок, psщоб побачити, чи вже запущений процес з таким ім'ям

2) при запуску спочатку перевірте наявність файлу pid (ідентифікатор процесу), як правило, у /var/run/program_name.pid, і, якщо він існує, прочитайте pid з файлу та перевірте, чи існує цей процес; якщо це станеться, відмовтеся починати. Якщо pid-файлу не існує або pid у файлі відійшов, створіть pid-файл, введіть у нього свій ідентифікатор процесу та продовжте звичайний запуск.

Хоча технічно можливо записати баш-труби, які будуть робити будь-яке з них безпосередньо у ваш crontab, краще додати їх до запущеної програми (так що вони застосовуватимуться незалежно від того, як вона починається) або написати сценарій обгортки для впорайтеся з цим, як запропонував Гаррік.


0

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

Я повторно використав вищевказану відповідь, покращивши відповідність шаблонів. pgrep без параметра f не відповідає шаблону процесу. Але все ж є проблема із використанням функції f. При варіанті f оболонка, що нерестовірує крон, завжди відповідає і повертає свій pid, отже, процес ніколи не запускається.

Додавання [] навколо однієї з літерних схем відповідає лише процесу, а pid оболонки cron не повертається.


0

Документи: https://www.timkay.com/solo/

solo - це дуже простий скрипт (10 рядків), який заважає програмі запускати більше однієї копії одночасно. Корисно за допомогою cron переконатися, що завдання не працює до того, як попереднє закінчилося.

Приклад

* * * * * solo -port=3801 ./job.pl blah blah
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.