0

最初にいくつかのセットアップの背景:

  • worker_cronjob という PHP ファイルを実行する cronjob があります。ファイルは git からワーカーをダウンロードするだけで、cron.d の cronjob は次のようになります。

    */1 * * * * ubuntu /home/ubuntu/worker_cronjob >> /home/ubuntu/worker.log

  • worker_despatcher ファイルが含まれています

  • これは子プロセスを起動します(ROOTは私のディレクトリへの絶対パスです):

    $PID = exec(sprintf("%s > %s 2>&1 & echo $!", "php ".ROOT."/worker/encoder.php".$arg_string, ROOT."/worker/encoder.log" ));

問題は、cronjob の下で、このメソッドがシステム コマンド、具体的には sh の実行方法を変更していることです。したがって、次のようなコマンドを実行すると:

ffmpeg

戻り値:

sh: 1: ffmpeg: command not found

試行錯誤の後、これはcronjobからのみ発生することを発見しました。chrootを呼び出さずにchrootするのと同じように、ディレクトリの設定方法が変更されています。

他のスレッドを調べたところ、cronjobs を作成してファイルを実行するときにフルパスを使用していると書かれていますが、問題は私のファイルではなく、それらはすべて絶対パスを介して参照されており、問題が発生するインストールされたプログラムを実行しています。

絶対パスはインストール済みのアプリにも適用されますか、それともこの機能を壊して 1 語でコマンドを実行できるようにする方法はありますか?

4

1 に答える 1

1

背後にある理由はcronjobs、システムによって実行されるため、シェルやユーザー環境変数について何も知らないためです。最小限の環境で実行されていると言えます。

crontabが機能しない理由には、非常に詳細な回答があります。

上記のリンクリソースに示されていない別の方法は次のとおりです。

* * * * * PATH=/usr/bin; command >> /var/log/command.log
于 2012-06-17T12:10:44.717 に答える