ルートcronのflockコマンドが実行されない

ルートcronのflockコマンドが実行されない

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スクリプトを実行するにはどうすればよいですか?flockcrontab

答え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の追加ファイル名として扱われます。flockcd

最初のコマンドが終了し、エラーが報告されなかったため、シェルの最初のインスタンス (元々は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

関連情報