
CentOS システム上の私のユーザーの crontab には、次のような内容があります。
58 12 * * * cd /home/joe/dev; echo `pwd` | logger
これは /var/log/messages に出力されます:
Feb 19 12:58:01 srv01 joe: /home/joe
次のように出力する代わりに:
Feb 19 12:58:01 srv01 joe: /home/joe/dev
出力時にディレクトリが保持されないのはなぜですかpwd
?
答え1
次のようにすれば動作するはずです:
58 12 * * * (cd /home/joe/dev; echo `pwd` | logger)
コマンドを括弧で囲むことで、すべてのコマンドを同じサブシェルで実行するように強制する必要があります。
答え2
コマンドは独立して実行されるため、同じシェル/環境で実行されることを期待するのとは異なります。必要なコマンドを実行するシェル スクリプトを作成し、crontab からスクリプトを呼び出す方が適切でしょう。
更新: 上記は推測であり、また、可能性の提案でした (コメントで簡潔かつ積極的に指摘されているように)。そこで CentOS 6.6 でテストしてみることにしましたが、間違っていました... 次の crontab エントリは正常に動作しました:
* * * * * echo \`pwd` |logger; cd /home; echo `pwd` |logger;
これでうまくいったはずです... crontab で個々のコマンドではなくスクリプトを呼び出す方が最適だと私は今でも主張しています... ただし、これは好みの問題です (コメントには親切にしてください...)。
答え3
に従ってこのUnix&Linux SEの回答異なる Linux ディストリビューションの cron のバージョンによって、このタイプの機能の処理方法が異なるため、;
を に置き換えることができます。&&
cd /home/joe/dev && echo `pwd` | logger