El comando grey en el cron raíz no se ejecuta

El comando grey en el cron raíz no se ejecuta

Tengo el siguiente código en mi rootcrontab en mi Debian

* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log

Pero no veo run.logarchivos run.lockdonde los especifico. De hecho, no hay evidencia de que el guión haya sido ejecutado.

Correr ps aux | grep runsólo produce esa grepllamada.

¿Cómo ejecuto el runscript flocken 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 cdcomo un proceso secundario, es decir, en otra instancia del shell. El cdcomando sin argumentos cambiará al directorio de inicio del usuario, después de lo cual el shell ejecutado flocksaldrá inmediatamente. Esto equivaldrá a no tener ningún efecto.

Incluso con el nombre de la ruta, el cd /absolute/path/to/projectcomando aquí no tendría ningún efecto en el directorio de trabajo del flockcomando, ni en el segundo comando ejecutado por la primera instancia del shell.Esto se debe a que el cdcomando solo afecta a la instancia de shell específica en la que se ejecuta, no a sus padres.

Se /absolute/path/to/projecttrata como un nombre de archivo adicional para el flockcomando, 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 crondemonio) ahora ejecutará el segundo comando. Como el directorio de trabajo de ese shell no ha cambiado, sigue siendo el directorio de inicio del rootusuario, 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 flockcomando) obtendrá toda la línea de comando restante, por lo que el cd /absolute/path/to/projectcomando se ejecutará de manera significativa antes de ejecutarse ./runen el directorio del proyecto.

información relacionada