root
Debianのcrontabには次のコードがあります。
* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
ただし、指定した場所にrun.log
ファイルは表示されません。run.lock
実際にスクリプトが実行されたという証拠はありません。
実行すると、そのps aux | grep run
呼び出しのみが生成されますgrep
。
ルートディレクトリでスクリプトを実行するにはrun
?flock
crontab
答え1
crontab 行のコマンドは期待どおり解析されません。
cronデーモンは、そのユーザー用に設定されたシェルを使用してコマンドを実行します。
&&
最初のシェルには、制御演算子で区切られた2つのコマンドが表示されます。したがって、2番目のコマンドは、最初のコマンドがゼロ戻りコード(成功を示す)で終了した場合にのみ実行されます。
最初のコマンドは次のとおりですflock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
。
2番目のコマンドは次のとおりです./run >> run.log
。
最初のコマンドはロックファイルを生成し、cd
そのコマンドをサブプロセス(つまりシェルの他のインスタンス)として実行します。引数のないコマンドはcd
ユーザーのホームディレクトリに変更され、その後実行されるシェルはflock
すぐに終了します。これはまったく効果がありません。
パス名があっても、cd /absolute/path/to/project
ここのコマンドはコマンドの作業ディレクトリやflock
シェルの最初のインスタンスで実行される 2 番目のコマンドには影響しません。cd
これは、コマンドが親インスタンスではなく実行中の特定のシェルインスタンスにのみ影響するためです。
./absolute/path/to/project
flock
cd
最初のコマンドがエラーを報告せずに終了したため、シェルの最初のインスタンス(元のcron
デーモンによって開始されます)は2番目のコマンドを実行します。シェルの作業ディレクトリは変更されていないため、まだユーザーのホームディレクトリなので、root
有効なものを実行しようとします/root/run >>/root/run.log
。
私の考えには、おそらく次の意味があります。
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
引用符は、最初のシェルがコマンドラインを分割するのを防ぐため、&&
2番目のシェル(flock
コマンドで始まる)は残りのコマンドライン全体を取得するため、コマンドはプロジェクトディレクトリで実行される前に意味のあるように実行されますcd /absolute/path/to/project
。./run