Macで次のように毎日午後11時にターミナルを開くようにcronジョブをスケジュールしました。
0 23 * * * open -a Terminal
それはうまくいきます!しかし、私が望むのは、ターミナルを開くだけでなく、その中で簡単なコマンドを実行することです。オンラインで見ると cronコマンドを&&
でチェーンできるように見えます :
0 23 * * * open -a Terminal && echo 'Hello, world!'
ただし、この変更されたcronジョブは、2番目のコマンドを実行せずにターミナルを開くだけです。 cronジョブで両方を実行する方法について何か考えはありますか?
pah および Sameer Naik によってすでにすばらしい回答が提供されていますが、私は an SO同様の質問への回答 。
0 23 * * * osascript -e 'tell application "Terminal" to do script "echo \"Hello, world\"!"'
次の答えは、[セパレータの後] 2番目のコマンドwithin [内部]をターミナルで実行することを想定しています。それ以外の場合は、cronjobのコマンドを交換する必要があります(現在のところ、それを持っているため、echo
はafterTerminal
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
ファイルが既にある場合は、その内容全体を置き換えて削除するのではなく、元のファイルをバックアップし、コマンドを追加できます[復元するものを含む]元のファイル]とターミナルを開きます。しかし、私はこれはあなたのケースではないと思います(とにかく、そうであれば、詳細でこの答えを拡張できます)。
My_cron_job.shというスクリプトを作成し、それをcron経由で実行できます0 23 * * * my_cron_job.sh
スクリプトへの絶対パスを指定します。 /users/your_user_name/scripts/my_cron_job.sh