Чи є спосіб мені сказати cron запускати додаток, але НЕ запускати його, якщо процес вже існує?
Чи є спосіб мені сказати cron запускати додаток, але НЕ запускати його, якщо процес вже існує?
Відповіді:
найпростіший спосіб - використовувати pgrep
у crontab:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
щоб запобігти Could not connect to display
помилкам. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Запустіть сценарій, а не безпосередньо програму. Є багато можливостей. Наприклад :
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 ...
було б краще записати якif ! pgrep myprog; then ...
$?
, наприклад, додавши повідомлення журналу чи обробку помилок між рядками.
Цей сценарій не запуститься знову, якщо попередній екземпляр не закінчився. Якщо ви хочете щось не запустити, якщо інший конкретний процес запущений, див. Сценарій 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
Ви можете використовувати файл блокування у своєму сценарії, але, будь ласка, див. Управління процесами .
flock
є однією утилітою, яку можна використовувати.
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
Зазвичай цим займається сама програма, а не сама програма cron
. Для цього є дві стандартні методики:
1) grep
висновок, ps
щоб побачити, чи вже запущений процес з таким ім'ям
2) при запуску спочатку перевірте наявність файлу pid (ідентифікатор процесу), як правило, у /var/run/program_name.pid
, і, якщо він існує, прочитайте pid з файлу та перевірте, чи існує цей процес; якщо це станеться, відмовтеся починати. Якщо pid-файлу не існує або pid у файлі відійшов, створіть pid-файл, введіть у нього свій ідентифікатор процесу та продовжте звичайний запуск.
Хоча технічно можливо записати баш-труби, які будуть робити будь-яке з них безпосередньо у ваш crontab, краще додати їх до запущеної програми (так що вони застосовуватимуться незалежно від того, як вона починається) або написати сценарій обгортки для впорайтеся з цим, як запропонував Гаррік.
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
Я повторно використав вищевказану відповідь, покращивши відповідність шаблонів. pgrep без параметра f не відповідає шаблону процесу. Але все ж є проблема із використанням функції f. При варіанті f оболонка, що нерестовірує крон, завжди відповідає і повертає свій pid, отже, процес ніколи не запускається.
Додавання [] навколо однієї з літерних схем відповідає лише процесу, а pid оболонки cron не повертається.
Документи: https://www.timkay.com/solo/
solo - це дуже простий скрипт (10 рядків), який заважає програмі запускати більше однієї копії одночасно. Корисно за допомогою cron переконатися, що завдання не працює до того, як попереднє закінчилося.
Приклад
* * * * * solo -port=3801 ./job.pl blah blah