2 votos

Crontab y C programa que se debe ejecutar en una ventana de terminal

Quiero crear una tarea en el Cron para que se ejecute un compilado .c archivo. Digamos que tengo un archivo que se llama program.c, en mi escritorio. Yo compilar usando gcc program.c, el que crea a.out archivo ejecutable.

Quiero abrir un terminal en cierto momento, a través de Cron y ejecutar a.out interior para mostrar su salida en el terminal. He abierto Crontab para la edición - crontab -e - y he intentado:

30 *  * * * /home/username/Desktop/a.out /Desktop/a.out 

y

30 *  * * * cd /home/username/Desktop/a.out && ./a.out 

y

30 *  * * * /bin/sh /home/username/Desktop/a.out

y

30 *  * * * bash -c "exec /home/username/Desktop/a.out"

Y nada funciona!

5voto

Spas Spasov Puntos 305

Si el archivo ejecutable genera un archivo de salida, o simplemente modifica algunas cosas, la tarea debe ser:

* * * * * /home/<user>/Desktop/a.out

Si las rutas dentro del programa son relativos, su punto de origen, debe estar correctamente definidos, de lo contrario el archivo de salida se coloca, por ejemplo, en la $HOME directorio en lugar de $HOME/Desktop, donde se supone que debe ser. Este es un error común.


Si el programa no escribe cualquier archivo de salida y sólo genera algunos datos en la salida estándar (stdout), debe redirigir a un archivo para ver en un lugar adecuado:

* * * * * /home/<user>/Desktop/a.out >> /home/<user>/Desktop/a.out.log 2>&1

Mientras que el stdout no es redirigido, Cron envío local de correos para el usuario, salvo si este es reemplazado por la configuración de la variable MAILTO en crontab:

MAILTO="my@custom.mail"
* * * * * /home/<user>/Desktop/a.out

Para ejecutar una aplicación de interfaz de usuario a través de Cron es la tarea más difícil, debido a que el Cron no está diseñado para trabajar con la interfaz gráfica. Algunas variables de entorno debe ser exportados y la mejor manera de hacer esto es crear un adicional de secuencia de comandos de inicio. Aquí está un ejemplo de cómo hacer que dentro de Ubuntu Unity/Gnome:

  • El cajón de la secuencia de comandos. Supongamos también se encuentra en la ~/Desktop directorio y se llama a-cron.sh. No te olvides de hacerlo ejecutable - chmod +x a-cron.sh. La secuencia de comandos debe mirar como esta:

    #!/bin/sh
    
    # Set the necessary environment variables - UBUNTU/UNITY/GNOME:
    export DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')
    export GNOME_DESKTOP_SESSION_ID=true
    export DBUS_SESSION_BUS_ADDRESS=$(sed -zne 's/^DBUS_SESSION_BUS_ADDRESS=//p' /proc/`pgrep gnome-session -U $(id -u)`/environ)
    
    #Open new terminal and execute the script:
    /usr/bin/gnome-terminal -x sh -c '/home/<user>/Desktop/a.out; exec bash'
    

    La parte exec bash tiene la intención de mantener la ventana de terminal abierto después de la ejecución de la a.out - también hay otros métodos disponibles, que se describen aquí.

  • Ahora crear usuario del Cron job - crontab -e - como esta:

    * * * * * /home/<user>/Desktop/a-cron.sh > /home/<user>/Desktop/a-cron.log 2>&1</pre>
    

    A diferencia del apartado anterior, el archivo de registro juega papel diferente aquí. Los mensajes de error de la ejecución de la a-cron.sh deberá ser por escrito dentro de a-cron.log - por lo que si todo va bien debe estar vacía.

  • Guarde y cierre crontab a aplicar el trabajo. Espere alrededor de un minuto para ver el resultado.

Referencias:

Demo - he creado un sencillo programa en C (este es mi primer intento) para comprobar cómo funciona todo esto:

enter image description here

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: