linux - programa - cronjob no ejecuta una secuencia de comandos que funcione bien independiente
ejecutar un programa al iniciar linux (2)
Como se ve en los comentarios, el problema es que no está definiendo qué programa debe usarse para ejecutar el script. Tenga en cuenta que un cronjob se ejecuta en un entorno pequeño; allí, no se puede suponer mucho. Es por eso que definimos caminos completos, etc.
Entonces necesitas decir algo como:
1 * * * * /bin/sh /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync
# ^^^^^^^
/bin/sh
es el binario que desea usar para ejecutar el script.
De lo contrario, puede establecer permisos de ejecución para el script y agregar un encabezado de script de shell que le indique qué intérprete usar:
#!/bin/sh
Si hace esto, no es necesario agregar la ruta del binario.
Desde Solución de problemas comunes con trabajos cron :
Usando caminos relativos. Si su trabajo cron está ejecutando un script de algún tipo, debe asegurarse de usar solo rutas absolutas dentro de ese script. Por ejemplo, si su script está ubicado en /path/to/script.phpand intenta abrir un archivo llamado file.php en el mismo directorio, no puede usar una ruta relativa como fopen (file.php). El archivo debe llamarse desde su ruta absoluta, como esta: fopen (/path/to/file.php). Esto se debe a que los trabajos cron no se ejecutan necesariamente desde el directorio en el que se encuentra el script, por lo que todas las rutas deben llamarse específicamente.
Además, entiendo que quieres ejecutar esto cada minuto.
Si es así,
1 * * * *
no funcionará.
Intead, se ejecutará
cada 1 minuto después de cada hora
.
Entonces, si desea ejecutarlo cada minuto, diga
* * * * *
.
Tengo mi archivo de script php en
/var/www/html/dbsync/index.php
.
Cuando
cd /var/www/html/dbsync/
y ejecuta
php index.php
funciona perfectamente.
Quiero llamar al archivo PHP a través del archivo sh, la ubicación del archivo SH es la siguiente
/var/www/html/dbsync/dbsync.sh
Este es el contenido del archivo
dbsync.sh
es:
/usr/bin/php /var/www/html/dbsync/index.php >> /var/www/html/dbsync/myscript.log 2>&1 -q -f
Cuando
cd /var/www/html/dbsync/
y ejecuto
./dbsync.sh
, funciona perfectamente también.
Ahora si configuro crontab de la siguiente manera:
1 * * * * /var/www/html/dbsync/dbsync.sh /var/www/html/dbsync
Sin embargo, este crontab no funciona como se esperaba.
¿Qué puede estar mal?
Es importante comprender lo que significan "shell de inicio de sesión" y "shell interactivo".
- shell de inicio de sesión: es brevemente cuando inicia sesión con la sesión ssh y obtiene una ventana de terminal donde puede ingresar comandos de shell. Después de iniciar sesión, el sistema ejecuta algunos archivos (.bashrc) y establece algunas variables de entorno como la variable PATH para usted.
- shell interactivo: después de iniciar sesión en un sistema, puede iniciar manualmente los terminales de shell. El sistema ejecuta algún archivo de perfil asignado a su cuenta (.bash_profile, .bash_login, .profile). Estos archivos también establecen algunas variables de entorno e inicializan la variable PATH para su sesión de shell abierta manualmente.
Al iniciar el sistema operativo, los scripts de shell y los trabajos cron no se ajustan a la manera mencionada anteriormente para iniciar un shell. Por lo tanto, no se ejecutan scripts del sistema (.bashrc) ni perfiles de usuario. Esto significa que nuestra variable PATH no está inicializada. No se pudieron encontrar los comandos de Shell porque la variable PATH no apunta a los lugares correctos.
Esto explica por qué su script se ejecuta con éxito si lo inicia manualmente pero falla cuando lo inicia a través de crontab.
Solución-1: utilice la ruta absoluta de cada comando de shell en lugar de solo el nombre del comando utilizado en sus archivos de script.
- en lugar de "awk" use "/ usr / bin / awk"
- en lugar de "sed" use "/ bin / sed"
Solución-2: ¡ Inicialice las variables de entorno y especialmente la variable PATH antes de ejecutar scripts de shell!