es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cron, ejecuta un script de bash como root, pero una parte (el script Python) como usuario.

Necesito ejecutar un script de bash periódicamente en un Jetson Nano (por lo tanto, en Ubuntu 18.04). El script debe realizar actualizaciones del sistema, extraer código Python de un repositorio y ejecutarlo como un usuario especificado. Entonces, creé este script:


#!/bin/bash # Actualizaciones del sistema sudo apt update sudo apt upgrade # Detener instancias previas del código Python pkill python3 # Moverse a la carpeta del script de Python cd /home/nombre_de_usuario/proyectos/mi_carpeta # Obtener actualizaciones desde el repositorio git stash git pull # Crear una carpeta ficticia para verificar la ejecución correcta del script de bash hasta este punto sudo -u nombre_de_usuario mkdir /home/nombre_de_usuario/proyectos/carpeta_ficticia_00 # Ejecutar el script de Python sudo -u nombre_de_usuario /usr/bin/python3 script.py --arg01 --arg02 # Crear una carpeta ficticia para verificar la ejecución correcta del script de bash hasta este punto sudo -u nombre_de_usuario mkdir /home/nombre_de_usuario/proyectos/carpeta_ficticia_01

He creado un trabajo cron para ejecutar este script como superusuario, usando el comando:

sudo crontab -e

y agregando la siguiente entrada:

00 13 * * * /home/nombre_de_usuario/proyectos/mi_carpeta/script.sh

Ahora, puedo ver que en el momento configurado, se crean ambas carpetas ficticias y realmente pertenecen al usuario nombre_de_usuario. Sin embargo, el script de Python no se ejecuta.

Intenté crear el trabajo cron como un usuario no root (crontab -e), pero en este punto, incluso si el script de Python se ejecuta, supongo que no podría ejecutar apt update/upgrade. ¿Cómo puedo solucionarlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema de que no se ejecute el script de Python, puedes intentar agregar la ruta completa a los comandos de git y python en el script, ya que los trabajos de cron pueden no tener acceso a las variables de entorno predeterminadas. Por ejemplo, cambia git stash a /usr/bin/git stash y /usr/bin/python3 a la ruta completa del ejecutable de python.

    Para abordar el problema de ejecutar los comandos de apt update/upgrade como un usuario no root, puedes otorgar privilegios de sudo a ese usuario para esos comandos específicos o modificar el script para que ejecute esos comandos como root antes de cambiar al usuario no root para los comandos de git y Python.

    Una forma de hacer esto es dividir el script en dos scripts separados. El primer script se puede ejecutar como root y ejecutará los comandos de apt y luego llamará al segundo script como el usuario especificado para ejecutar los comandos de git y Python.

    Por ejemplo, el primer script (run_updates.sh) puede verse así:

    #! /bin/bash
    
    ## actualizaciones del sistema como root
    sudo apt update
    sudo apt upgrade
    
    ## moverse a la carpeta del script de Python
    cd /home/user_name/projects/my_folder
    
    ## llamar al segundo script como user_name
    sudo -u user_name /home/user_name/projects/my_folder/run_script.sh
    

    Y el segundo script (run_script.sh) se puede modificar así:

    #! /bin/bash
    
    ## detener instancias anteriores del código de Python
    pkill python3
    
    ## obtener actualizaciones del repositorio
    /usr/bin/git stash
    /usr/bin/git pull
    
    ## crear carpeta ficticia para verificar la ejecución del script de bash hasta este punto
    sudo -u user_name mkdir /home/user_name/projects/dummy_folder_00
    
    ## ejecutar script de Python
    /usr/bin/python3 python_script.py --arg01 --arg02
    
    ## crear carpeta ficticia para verificar la ejecución del script de bash hasta este punto
    sudo -u user_name mkdir /home/user_name/projects/dummy_folder_01
    

    Luego, puedes crear un trabajo de cron para ejecutar el primer script como root:

    00 13 * * * /home/user_name/projects/my_folder/run_updates.sh
    

Comments are closed.