Программа 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
применить работу. Подождите около минуты, чтобы увидеть результат.
Рекомендации:
Этот ответ является основным источником третьего раздела, там также можно найти необходимые envvars, которые должны быть экспортированы для сред рабочего стола, отличных от Unity/Gnome.
В этом вопросе OP использует Crontab root, но это не очень хорошая идея, потому что в рамках этого подхода владение некоторыми файлами и каталогами внутри
/run/user/<uid>/dconf/
будет изменено, таким образом, будет сгенерировано много ошибок.Откройте терминал gnome программно и выполните команды после выполнения bashrc
Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен? (для использования в crontab) |
Как получить номер дисплея мне был назначен X
Демо - я только что создал простую программу на C (это моя первая попытка), чтобы проверить, как все это работает: