コンパイル済みの.c
ファイルを実行するCronジョブを作成したい。デスクトップに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"
そして、何も動作しません!
実行可能ファイルが出力ファイルを生成する場合、または単に何かを変更する場合、Cronジョブは次のようになります。
* * * * * /home/<user>/Desktop/a.out
プログラム内のパスが相対パスである場合、それらの起点は適切に定義される必要があります。そうでない場合、出力ファイルは、たとえば、$HOME
ではなく$HOME/Desktop
ディレクトリに配置されます。これはよくある間違いです。
プログラムが出力ファイルを書き込まず、 stdout 内にデータを生成する場合、適切な場所に表示するために redirect をファイルに保存する必要があります(この部分は2>&1
がリダイレクトし、エラーメッセージがstdoutにリダイレクトされます):
* * * * * /home/<user>/Desktop/a.out >> /home/<user>/Desktop/a.out.log 2>&1
Stdoutはリダイレクトされませんが、CronはMAILTO
の変数crontab
を設定してオーバーライドしない限り、ユーザーに ローカルメール を送信します。
MAILTO="[email protected]"
* * * * * /home/<user>/Desktop/a.out
CronはGUIで動作するように設計されていないため、Cronを介してGUIアプリケーションを実行するのはより困難な作業です。 環境変数が少ない をエクスポートする必要があります。これを行うための最良の方法は、追加の起動スクリプトを作成することです。 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
の実行後にターミナルウィンドウを開いたままにすることを目的としています-他にも利用可能なアプローチがあります。これについては here で説明します。
次のように、ユーザーの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
を保存して閉じます。結果が表示されるまで1分ほど待ちます。
参照:
この回答 は3番目のセクションの主な情報源であり、必要なものもあります envvars = Unity/Gnomeとは異なるデスクトップ環境用にエクスポートされます。
この質問 では、OPはルートのCrontabを使用しますが、このアプローチではいくつかのファイルの所有権があるため、これは良い考えではありません/run/user/<uid>/dconf/
内のディレクトリが変更されるため、多くのエラーが生成されます。
コンピューターの起動/再起動時に、それぞれが異なるプロファイルを持ついくつかのタブを持つ1つ(または複数)のgnome-terminalウィンドウを開く方法?
DISPLAYが設定されていないときにDISPLAYの現在の値をプログラムで見つける方法(crontabで使用) | Xによって割り当てられたディスプレイ番号を取得する方法
デモ-単純なCプログラムを作成しました(これが私の最初の試みです)。