10

Могу ли я сказать cron запустить приложение, НО не запускать его, если процесс уже существует?

5 ответов5

21

самый простой способ, используйте pgrep

в crontab:

* * * * * 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
6

Этот сценарий не запустится снова, если предыдущий экземпляр еще не завершен. Если вы не хотите запускать что-либо, если запущен другой конкретный процесс, смотрите скрипт 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 - это одна утилита, которую можно использовать.

1

Это обычно обрабатывается самой программой, а не cron . Для этого есть два стандартных метода:

1) grep вывод ps чтобы увидеть, запущен ли уже процесс с таким именем

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

Хотя технически возможно написать bash-каналы, которые будут выполнять любой из них непосредственно в вашем crontab, лучше добавить их в запускаемую программу (чтобы они применялись независимо от того, как она запускается) или написать скрипт-обертку для справиться с этим, как предположил Харримк.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .