Могу ли я сказать cron запустить приложение, НО не запускать его, если процесс уже существует?
5 ответов
самый простой способ, используйте pgrep
в crontab:
* * * * * 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
Этот сценарий не запустится снова, если предыдущий экземпляр еще не завершен. Если вы не хотите запускать что-либо, если запущен другой конкретный процесс, смотрите скрипт 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
- это одна утилита, которую можно использовать.
Это обычно обрабатывается самой программой, а не cron
. Для этого есть два стандартных метода:
1) grep
вывод ps
чтобы увидеть, запущен ли уже процесс с таким именем
2) При запуске сначала проверьте наличие файла pid (идентификатор процесса), обычно по адресу /var/run/program_name.pid
, и, если он существует, прочитайте pid из файла и проверьте, существует ли этот процесс еще ; если это произойдет, откажитесь начать. Если pid-файл не существует или pid в файле исчез, то создайте pid-файл, запишите в него свой идентификатор процесса и продолжите обычный запуск.
Хотя технически возможно написать bash-каналы, которые будут выполнять любой из них непосредственно в вашем crontab, лучше добавить их в запускаемую программу (чтобы они применялись независимо от того, как она запускается) или написать скрипт-обертку для справиться с этим, как предположил Харримк.