Tengo un script de shell main.sh que ejecuta un script de python main.py Cuando ejecuto el script main.sh manualmente, la ejecución está bien ( Nota : lo estoy ejecutando manualmente con el usuario root ) y el script de python funciona como se esperaba. Sin embargo, cuando intento lo mismo desde crontab , que ejecuta el script main.sh cada 30 minutos, entonces el script de python no se ejecuta (ya he hecho chmod u+x main.sh para que sea ejecutable)
El crontab que se muestra a continuación también es del usuario raíz.
mi archivo crontab: */30 * * * * /home/opc/python_scripts/main.sh >> /home/opc/cron.log .
mi archivo main.sh:
#!/bin/bash output=$(sh /home/opc/python_scripts/url.sh) echo "$output" searchstring="url is up, login service is up and oc console is up" if [[ "$output" == *"$searchstring"* ]] ; then echo "URL is up" sudo python3 /home/opc/python_scripts/main.py >> /home/opc/pyfile.log else echo "URL is Down" sudo python3 /home/opc/python_scripts/disable_crr.py fi Sé que está ingresando la primera condición if y también está imprimiendo la declaración "URL is up", tengo otro archivo de registro que registra esto. Cuando lo ejecuto manualmente, puedo ver que incluso el script de python se ejecuta correctamente, pero con crontab se atasca en echo "URL is up" , después de eso no ocurre ninguna ejecución.
Cosas que he hecho para resolver esto:
He visto soluciones de preguntas similares como: llamar a un script de Python desde el script de shell cron , script de Shell: ejecutar un programa de Python desde un script de Shell , pero en todas estas preguntas el usuario no pudo ejecutar el script de Python desde el shell guión manualmente. Puedo ejecutarlo manualmente, pero si uso un cronjob , entonces tengo un problema.
cuando ejecuté ls -la en el directorio donde se encuentran estos scripts, la propiedad de estos archivos era como:
main.sh root root main.py opc opc También agregué #!/usr/bin/env python3 en la parte superior de mi secuencia de comandos de python, ya que había visto esto como una solución en una pregunta similar pero no funcionó, solo funciona manualmente, no con crontab.
¿Cómo lo ejecuto con crontab?
¿Intentaste eliminar sudo ?
Sin embargo, dado que tiene que correr cada 30 minutos, también puede considerar:
scheduleEstá intentando ejecutar el script con sudo, pero cron no puede solicitarle la contraseña. Dado que este es el crontab de root, no debería necesitar usar sudo.
Si debe usar sudo en cron, debe designar esos comandos para que no tengan contraseña a través de /etc/sudoers. Algo a lo largo de estas líneas debería funcionar.
opc ALL=(root) NOPASSWD: /home/opc/python_scripts/main.pyAsí que no sé cuál era el problema, pero lo resolví.
Cómo:
anteriormente, como mencioné en mi pregunta, había intentado las dos preguntas anteriores por separado.
#!/usr/bin/env bash dirName=`dirname $0` baseName=`basename $0` arg1=$1 arg2=$2 cd ${dirName} && python ./room_wise.py arg1 arg2No entiendo completamente cuál era el problema, pero sí, cuando usé ambas soluciones juntas, comenzó a funcionar. Además, como otras personas han mencionado en esta publicación, no use sudo si está usando crontab de root y, de lo contrario, puede generar problemas de autorización. Esto lo resolvió, así que, si alguien tiene una mejor comprensión, agregue sus respuestas también.