
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