
Tengo el siguiente código en mi root
crontab en mi Debian
* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
Pero no veo run.log
archivos run.lock
donde los especifico. De hecho, no hay evidencia de que el guión haya sido ejecutado.
Correr ps aux | grep run
sólo produce esa grep
llamada.
¿Cómo ejecuto el run
script flock
en la raíz crontab
?
Respuesta1
El comando en la línea crontab no se analiza de la forma esperada.
El demonio cron ejecutará el comando utilizando el shell configurado para el usuario en cuestión.
Este primer shell verá dos comandos, separados por el &&
operador de control. Por lo tanto, el segundo comando se ejecuta solo si el primer comando sale con un código de retorno cero, lo que indica un éxito.
El primer comando es: flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
.
El segundo comando es: ./run >> run.log
.
El primer comando creará el archivo de bloqueo y ejecutará el comando cd
como un proceso secundario, es decir, en otra instancia del shell. El cd
comando sin argumentos cambiará al directorio de inicio del usuario, después de lo cual el shell ejecutado flock
saldrá inmediatamente. Esto equivaldrá a no tener ningún efecto.
Incluso con el nombre de la ruta, el cd /absolute/path/to/project
comando aquí no tendría ningún efecto en el directorio de trabajo del flock
comando, ni en el segundo comando ejecutado por la primera instancia del shell.Esto se debe a que el cd
comando solo afecta a la instancia de shell específica en la que se ejecuta, no a sus padres.
Se /absolute/path/to/project
trata como un nombre de archivo adicional para el flock
comando, no como un parámetro para cd
.
Dado que el primer comando salió y no informó ningún error, la primera instancia del shell (originalmente iniciada por el cron
demonio) ahora ejecutará el segundo comando. Como el directorio de trabajo de ese shell no ha cambiado, sigue siendo el directorio de inicio del root
usuario, por lo que termina intentando ejecutar lo que efectivamente es /root/run >>/root/run.log
.
Supongo que probablemente quisiste decir algo como esto:
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
Las comillas evitarán que el primer shell divida la línea de comando en &&
, por lo que el segundo shell (iniciado por el flock
comando) obtendrá toda la línea de comando restante, por lo que el cd /absolute/path/to/project
comando se ejecutará de manera significativa antes de ejecutarse ./run
en el directorio del proyecto.