OSにsay
スクリプトがあります。興味のあるディレクトリを含む特定のディレクトリでスクリプトが機能していることを確認しました。ただし、インタラクティブシェル(Terminal.app、xtermなど、またはEmacsのEshell)で実行している場合にのみ可能です。ちなみに、スクリプトをcronjobとして実行するときに実行することは、スクリプトで一度だけ呼び出しを実行することです。ボックスが閉じるまでダイアログsay
もなく、繰り返しもありません。これがまさに私が期待するものです。say
しかし、私にはエラーメッセージが表示されないので、すべてが大丈夫だと思うようmail
です。cron
cronjobを設定する方法は次のとおりです。
SHELL=/bin/zsh
*/1 * * * * . $HOME/.zshrc && ps caux | grep -iq my_script && : || $HOME/bin/my_script /some/dir
翻訳:1分ごとに実行され、最初にソーシングされます~/.zshrc
(環境変数の設定など$PATH
)。その後、実行され、ps caux
私のスクリプトのプロセス名を特定し、一致するものが見つかった場合は何もしません。それ以外の場合は、targetを使用してスクリプトを実行します/some/dir
。私のプロセスが実行されていることを確認する目的は、重複するインスタンスが発生していないことを確認し、正しく機能していることを確認することです。
したがって、端末でこのcronjobのコードを実行すると正常に動作します。しかし、前述のように、cronjob自体が期待どおりに実行されないのには理由があります。この種の問題についてGoogleに連絡したときに見つけたことは次のとおりです。SOに関するこの質問これは私の問題を反映しているようですが、Linuxの場合です。私は前に試しました受け入れられた回答そこにはまで作業を始めようとしていると言われていますxterm
。つまり:
*/1 * * * * . $HOME/.zshrc && xterm -e ps caux | grep -iq my_script && : || $HOME/bin/my_script /some/dir
しかし、これは役に立ちません。繰り返しますが、インタラクティブシェルを介してこのcronjobを実行するコードは期待どおりに機能しますが、それでもスクリプトを奇妙にcron
実行します。唯一の違いは、xterm
ウィンドウが1分ごとに表示されることです。
なぜこれが起こるのか混乱しています。スクリプトがインタラクティブシェルで実行されているときと同じように機能したいです。どのようにし、cron
スクリプトが予期しない方法で実行されるのですか?