タスクを実行した後、クローンメール転送が機能するかどうかをテストしたいと思います。これをテストしてから、数秒ごとに実行するようにcronジョブを設定するよりエレガントな方法はありますか?それでは、cronジョブの実行をシミュレートするか、cronジョブを手動で起動しますが、cronが自動的に実行されたときと同じ動作を実行する方法はありますか?
答え1
コマンドラインでcronジョブを実行することとcron内でcronジョブを実行することの主な違いは、環境です。他の潜在的な違いには、現在のディレクトリ、端末の可用性、使用されているシェルなどがあります。
これは、cronを介してcronジョブを実行する非常に正確なシミュレーションです。シェルによる違いを避けるために、タスクをスクリプトに入れ、スクリプトパスのみをcrontabに入力してください。 cronが渡す環境変数の正確な設定と値は実装によって異なります。crontab(5)
システムのマニュアルページを確認してください。ifne
入力を受け取ると、引数で指定されたコマンドを実行するコマンドです。その他のユーティリティ。
env -i HOME="$HOME" LOGNAME="$LOGNAME" PATH=/usr/bin:/bin SHELL=/bin/sh USER="$USER" \
/path/to/script </dev/null 2>&1 |
ifne mail -r "Cron Daemon" -s "Cron <$USER@$(hostname)> /path/to/script" "$USER"
cronに似た設定を作成する別の方法は次のとおりです。at
。ただし、プロセスで受け取った環境変数をat
使用してコマンドを実行する役割を担うので、この部分は依然として模擬作業を必要とします。at
echo /path/to/script |
env -i HOME="$HOME" LOGNAME="$LOGNAME" PATH=/usr/bin:/bin SHELL=/bin/sh USER="$USER" \
at now
答え2
数年前に作成したが最近失敗し始めたスクリプトのクローン実行をシミュレートする方法は次のとおりです。
私は次のスクリプトを作成しましたdumpenv
。
#!/bin/sh
base=$(basename $0)
env -0 > /tmp/$base.$$.dump
その後、すべての環境変数が/tmp/
。
*/1 * * * * [path to newly created script]
これにより、スクリプトは1分ごとに実行されます。 1分後、cronが実行しているジョブから見た環境ダンプが得られました。 crontab行が1分以上実行されると、ファイル名のpid部分($$
)のみが異なる名前を持つ同じファイルの束を生成します。それは大きな問題ではありません。この可能性についてコーディングして1つのファイルしか取得できませんが、ここでの主な原則は「十分に良い」ということであり、いくつかのdumpenv
ダンプが役に立つ他の状況でそれを使用したい場合があります。とにかく、追加されたcrontabラインを削除して、多くのゴミで満たされるの/tmp
を防ぐことをお勧めします。
/tmp/command
その後、実行したいコマンドが1行に含まれる追加のファイルを作成しました。ヌル文字で終了します。ヌル文字が必要です。
次に、以下を発行します。
cat [path to dumpfile crated earlier] /tmp/command | xargs -0 -x env -i
これは、cronでコマンドを実行したときに表示されるエラーを複製します。これが行うことは、xargs
次の形式のコマンドを作成することです。
env -i [list of environment variables] [command to execute]
実行してみてください。環境変数のリストはダンプファイルから取得されます。実行されるコマンドはファイルenv
から来ます。/tmp/command
上記と必須のヌル文字の引数は、変数を-0
渡すときの環境の破損を防ぐためです。環境に改行文字を含む環境変数がない場合は、スクリプトおよびコマンド呼び出しからこれを省略できます。ファイルには行終端文字としてヌル文字は必要ありません。env
xargs
-0
env
dumpenv
xargs
/tmp/command
xargsは自動的にstdinを/ dev / nullにリダイレクトしたため、明示的にstdinを/ dev / nullにリダイレクトしませんでした。また、stdout / stderrをリダイレクトすることを気にせず、コマンドが失敗したときに電子メールを受信したくありません。これらの機能が必要な場合、Gilesの答えはそれを実装する方法を提供します。
答え3
ルイスの答え大きい。私はいくつかの可能な改善点を提案しました。
/tmp/command
次のコードで、Louisが提案したように実行するスクリプトへのパスを含むファイルを生成しないでください。
cat [path to dumpfile crated earlier] /tmp/command | xargs -0 -x env -i
代わりに、次の回避策を使用してコマンドからスクリプト名を直接指定できます(\x00
cronスクリプトパスに追加することが不可欠です)。
printf "/path/to/cron/script\x00" | cat /path/to/dumpfile/created/earlier - | xargs -0 -x env -i
これにより、ファイルを作成する必要がなくなります/tmp/command
。