web-dev-qa-db-ja.com

ターミナルウィンドウで実行するCrontabおよびCプログラム

コンパイル済みの.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"

そして、何も動作しません!

2
IDK

実行可能ファイルが出力ファイルを生成する場合、または単に何かを変更する場合、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分ほど待ちます。

参照:

デモ-単純なCプログラムを作成しました(これが私の最初の試みです)。

enter image description here

5
pa4080