ルートcronのクラスタコマンドは実行されません。

ルートcronのクラスタコマンドは実行されません。

rootDebianの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

ルートディレクトリでスクリプトを実行するにはrunflockcrontab

答え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/projectflockcd

最初のコマンドがエラーを報告せずに終了したため、シェルの最初のインスタンス(元の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

関連情報