¿Hay alguna manera de decirle a cron que ejecute una aplicación PERO no la ejecute si ya existe un proceso?
¿Hay alguna manera de decirle a cron que ejecute una aplicación PERO no la ejecute si ya existe un proceso?
Respuestas:
de la manera más simple, use pgrep
en crontab:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
para evitar Could not connect to display
errores. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Ejecute un script, en lugar de directamente el programa. Hay muchas posibilidades Por ejemplo :
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 ...
estaría mejor escrito comoif ! pgrep myprog; then ...
$?
, por ejemplo, agregando mensajes de registro o manejo de errores entre líneas.
Este script no se ejecutará nuevamente si la instancia anterior no ha terminado. Si no desea ejecutar algo si se está ejecutando otro proceso específico, consulte el script de 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
Puede usar un archivo de bloqueo en su secuencia de comandos, pero consulte Gestión de procesos .
flock
es una utilidad que se puede usar.
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
Esto generalmente es manejado por el programa en sí mismo en lugar de hacerlo cron
. Hay dos técnicas estándar para esto:
1) grep
la salida de ps
para ver si ya se está ejecutando un proceso con ese nombre
2) Al inicio, primero verifique la existencia de un archivo pid (id de proceso), generalmente en /var/run/program_name.pid
, y, si existe, lea el pid del archivo y verifique si ese proceso todavía existe; si lo hace, rehúse comenzar. Si el archivo pid no existe o el pid en el archivo se ha ido, cree un archivo pid, escriba su identificación de proceso y continúe con el inicio normal.
Si bien es técnicamente posible escribir tubos de bash que harán cualquiera de estos directamente en su crontab, es mejor agregarlos al programa que se está iniciando (para que se apliquen sin importar cómo se inicie) o escribir un script de envoltura para manejar esto, como sugirió harrymc.
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
He reutilizado la respuesta anterior con una mejora en la coincidencia de patrones. pgrep sin la opción f no coincide con el patrón de proceso. Sin embargo, hay un problema con el uso de la opción f. Con la opción f, el shell que genera el cron siempre coincide y devuelve su pid, por lo tanto, el proceso nunca se reinicia.
Agregar un [] alrededor de uno de los patrones de letras coincide solo con el proceso y no se devuelve el pid del cron shell.