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

Я хочу создать задание Крона для выполнения скомпилированного .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"

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

2
задан 14 September 2017 в 19:13

1 ответ

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

* * * * * /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 применять задание. Ожидайте приблизительно минута для наблюдения результата.

Ссылки:

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

enter image description here

5
ответ дан 2 December 2019 в 01:54

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

Похожие вопросы: