Программа Crontab и C, которая должна быть выполнена в окне терминала

Я хочу создать задание Cron для запуска скомпилированного .c файл. Допустим, у меня есть файл, который называется program.cна моем рабочем столе. Я компилирую это gcc program.c, который создает a.out запускаемый файл.

Я хочу открыть терминал в определенное время через Cron и запустить a.out внутри, чтобы показать его вывод в терминал. Я открыл Crontab для редактирования - crontab -e - и я попробовал:

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

а также

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

а также

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

а также

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

И ничего не работает!

1 ответ

Решение

Если исполняемый файл генерирует выходной файл или просто изменяет некоторые вещи, задание Cron должно быть:

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

Если пути внутри программы являются относительными, их исходная точка должна быть правильно определена, иначе выходной файл будет помещен, например, в $HOME каталог вместо $HOME/Desktop где вы, как вы думаете, быть. Это распространенная ошибка.


Если программа не записывает какой-либо выходной файл и просто генерирует некоторые данные в stdout, вы должны перенаправить их в файл, чтобы увидеть его в соответствующем месте (эта часть 2>&1 перенаправляет и сообщения об ошибках на стандартный вывод):

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

Пока стандартный вывод не перенаправлен, Cron будет отправлять локальные письма пользователю, если только это не будет отменено путем установки переменной MAILTO в crontab:

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

Выполнить приложение с графическим интерфейсом через Cron является более сложной задачей, потому что Cron не предназначен для работы с графическим интерфейсом. Немного переменных среды должны быть экспортированы, и лучший способ сделать это - создать дополнительный сценарий запуска. Вот пример, как это сделать в Ubuntu Unity/Gnome:

  • Создайте сценарий. Давайте предположим, что он также находится в ~/Desktop каталог и называется a-cron.sh, Не забудьте сделать его исполняемым - chmod +x a-cron.sh, Скрипт должен выглядеть так:

    #!/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'
    

    Часть exec bash намерен держать окно терминала открытым после выполнения a.out - есть и другие доступные подходы, которые описаны здесь.

  • Теперь создайте пользовательскую работу Cron - crontab -e - как это:

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

    В отличие от приведенного выше раздела, файл журнала здесь играет другую роль. Сообщения об ошибках при выполнении a-cron.sh должно быть написано внутри a-cron.log - так что, если все в порядке, оно должно быть пустым.

  • Сохрани и закрой crontab применить работу. Подождите около минуты, чтобы увидеть результат.

Рекомендации:

Демо - я только что создал простую программу на C (это моя первая попытка), чтобы проверить, как все это работает:

Другие вопросы по тегам