Я хочу создать задание Крона для выполнения скомпилированного .c
файл. Скажем, у меня есть файл, названный program.c
, на моем рабочем столе. Я компилирую его использование gcc program.c
, который создает a.out
исполняемый файл.
Я хочу открыть терминал в определенное время через Крон и работать 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"
И ничто не работает!
Если исполняемый файл генерирует выходной файл или просто изменяет некоторые вещи, задание Крона должно быть:
* * * * * /home/<user>/Desktop/a.out
Если пути в программе относительны, их точка источника должна быть правильно определена, иначе выходной файл будет помещен, для примера, в $HOME
каталог вместо $HOME/Desktop
, где Вы предполагаете, чтобы быть. Это - частая ошибка.
Если программа не пишет выходного файла и просто генерирует некоторые данные в stdout, необходимо перенаправить его в файл для наблюдения его в соответствующее место (эта часть 2>&1
перенаправления и сообщения об ошибках к stdout):
* * * * * /home/<user>/Desktop/a.out >> /home/<user>/Desktop/a.out.log 2>&1
В то время как stdout не перенаправляется, Крон будет, отправляя местные почты пользователю, если это не будет переопределено путем установки переменной MAILTO
в crontab
:
MAILTO="my@custom.mail"
* * * * * /home/<user>/Desktop/a.out
Выполнить приложение GUI через Крон - более трудная задача, потому что Крон не разработан для работы с GUI. Немного переменных среды должны быть экспортированы и лучший способ сделать, который должен создать дополнительный сценарий запуска. Вот пример, как сделать это в Единице/Gnome Ubuntu:
Упакуйте сценарий в ящики. Давайте предположим, что это также расположено в ~/Desktop
каталог и называют a-cron.sh
. Сделайте nоt забывают делать это исполняемым файлом - 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
- существуют также другие доступные подходы, которые описаны здесь.
Теперь создайте задание Крона пользователя - 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, который должен экспортироваться для настольных сред, отличающихся от Единицы/Gnome.
В этом вопросе OP использует Crontab корня, но это не хорошая идея, потому что в рамках этого подхода владение некоторых файлов и каталогов внутри /run/user/<uid>/dconf/
будет изменен, таким образом много ошибок будет сгенерировано.
Откройте терминал гнома программно и выполните команды после того, как bashrc выполнялся
Как программно найти текущее значение ДИСПЛЕЯ, когда ДИСПЛЕЙ сброшен? (для использования в crontab) | Как получить число дисплея, мне присвоили X
Демонстрация - я просто создал простую программу C (это - моя первая попытка) чтобы проверить, как все это работает: