web-dev-qa-db-ja.com

ターミナルを開いてコマンドを順番に実行するようにcronジョブをスケジュールします

Macで次のように毎日午後11時にターミナルを開くようにcronジョブをスケジュールしました。

0 23 * * * open -a Terminal

それはうまくいきます!しかし、私が望むのは、ターミナルを開くだけでなく、その中で簡単なコマンドを実行することです。オンラインで見ると cronコマンドを&&でチェーンできるように見えます

0 23 * * * open -a Terminal && echo 'Hello, world!'

ただし、この変更されたcronジョブは、2番目のコマンドを実行せずにターミナルを開くだけです。 cronジョブで両方を実行する方法について何か考えはありますか?

9
Gyan Veda

pah および Sameer Naik によってすでにすばらしい回答が提供されていますが、私は an SO同様の質問への回答

0 23 * * * osascript -e 'tell application "Terminal" to do script "echo \"Hello, world\"!"'
4
Gyan Veda

次の答えは、[セパレータの後] 2番目のコマンドwithin [内部]をターミナルで実行することを想定しています。それ以外の場合は、cronjobのコマンドを交換する必要があります(現在のところ、それを持っているため、echoafterTerminal exitsのみを実行するため)。

0 23 * * * echo 'Hello, world!' && open -a Terminal

ここで、コマンドwithinを新しく実行したいターミナルを実行したいとします。

Terminalアプリケーション(/Applications/Utilities/Terminal.app/Contents/MacOS/Terminalから)がコマンドライン引数を受け入れる[つまり解釈する]ことも、標準入力[リダイレクトされた標準出力]から何も読み取らないことも知りません。

open -a Terminal && echo 'Hello, world!'で実行していることは、基本的にTerminalアプリケーションを呼び出していることです(成功した場合)前のコマンド(Terminalを呼び出したのと同じシェルで'Hello, world!'を印刷します)。これは、同じシェルで2つの個別のコマンドを実行することに似ていますが、最初のコマンドが成功した場合にのみ最新のコマンドを実行します。

現在のユーザーに対してbash(現在のデフォルトのosxシェル)が読み込まれるたびに(たとえば、ユーザーがTerminalを開くたびに)特定のコマンド(たとえばecho 'Hello, world!')を実行する場合は、そのコマンドを~/.bash_profileに追加できます。例えば:

echo "echo 'Hello, world!'" >> ~/.bash_profile

Terminalを開くと、コマンド「echo 'Hello、world!'」が実行されます。

MacOSXの最新バージョンにはデフォルトで~/.bash_profileが含まれていないため、これを利用してcrontabを次のように変更できます。

0 23 * * * echo "echo 'Hello, world!' > ~/.bash_profile" && open -a Terminal

これは基本的に、このcrontabエントリが実行されてTerminalを開くたびに~/.bash_profileの内容を置き換えます。

この方法を使用することの欠点は、~/.bash_profile内に配置したものは、crontabからのものであるか、ユーザーがいつでも開く可能性があるものかどうかに関係なく、開かれたTerminalごとに実行されることです。

これを解決するには、~/.bash_profileの後に末尾にrm -f ~/.bash_profileコマンドを配置して、echo 'Hello, world!'ファイルをその中から削除することもできます。

0 23 * * * echo "echo 'Hello, world!'; rm -f ~/.bash_profile" > ~/.bash_profile" && open -a Terminal

これにより、Terminalが開いてbashを呼び出したときに、末尾の~/.bash_profileを含むすべてのrm -f ~/.bash_profileコマンドが実行されるため、~/.bash_profileが存在しないため、Terminalへの次の呼び出しによってコマンドが再度トリガーされることはありません。

補足:何らかの理由で、~/.bash_profileファイルが既にある場合は、その内容全体を置き換えて削除するのではなく、元のファイルをバックアップし、コマンドを追加できます[復元するものを含む]元のファイル]とターミナルを開きます。しかし、私はこれはあなたのケースではないと思います(とにかく、そうであれば、詳細でこの答えを拡張できます)。

2
pah

My_cron_job.shというスクリプトを作成し、それをcron経由で実行できます0 23 * * * my_cron_job.shスクリプトへの絶対パスを指定します。 /users/your_user_name/scripts/my_cron_job.sh

0
Sameer Naik