Linuxでコマンドラインから直接実行可能ファイルを実行することとcronジョブから実行することの違いは何ですか?
-
06-07-2019 - |
質問
リモートサーバーにコマンドをクエリし、ローカルマシンで実行し、stdout(および場合によってはstderr)をサーバーに返すこの実行可能ファイルがあります。
この実行可能ファイルは、コマンドラインから(rootとして)呼び出された場合は問題なく実行されますが、cronジョブによって自動的に実行された場合、一部のコマンドで失敗することがわかりました。
環境(ユーザー、stdin、stdoutなど)の違いは何ですか?この実行可能ファイルをcrontabを使用して定期的に実行するようにスケジュールするときはどうすればよいですか?
ありがとう!
解決
最も重要な違いは、.bashrcなどのファイルはcronジョブの前に実行されないため、通常コマンドラインにある多くの環境変数が失われることです。したがって、プログラムがcronジョブで機能しない場合は、必要なすべての環境変数を設定するスクリプトに埋め込みます。
入力と出力に関して、明らかにcronジョブのユーザーインタラクションはないため、プログラムは入力を期待しないでください(入力する場合は入力ファイルから、またはスクリプトで直接提供します)。ログファイル。
他のヒント
この実行可能ファイルは、コマンドラインから(rootとして)呼び出された場合は問題なく実行されますが、cronジョブによって自動的に実行された場合、一部のコマンドで失敗することがわかりました。
cronジョブでは、次のように、スクリプトを実行するユーザーを指定できます。
0 0 * * * www-data /usr/bin/php /var/www/foo/do_work.php
「do_work.php」を毎日www-dataとして実行するように指定しています...このファイルは/etc/cron.d/にあります
また、特にユーザーレベルではなく「グローバル」な/ etc / crontabジョブの場合、cronがタスクの実行に使用するUIDを確認する必要があります。ジョブが「nobody」または「cron」から実行されている場合、一部の権限が不足している可能性があります。
主に
- 現在の作業ディレクトリ-これがcronからのものになることを保証できません。 $ HOMEかもしれませんが、頼りにしないでください
- 環境変数-通常のログイン用に設定されているほとんどの変数は設定されないため、環境変数に特定の値が必要な場合は失敗する可能性があります。これには特に$ PATHが含まれます。
- stdin / stdout / stderrはttyではないため、一部のプログラムはこれにより異なる動作をします(stdoutとerrはおそらく一時ファイルです。stdinはおそらくnullです)
ただし、基本的にはあまり頼ることはできません
- ユーザーID、グループID、および補助グループは、cronジョブの所有者の通常のログインに従って設定する必要があります