テスト/デバッグ目的でcronにすぐにジョブを実行させるにはどうすればよいですか?スケジュール変動はありません!

テスト/デバッグ目的でcronにすぐにジョブを実行させるにはどうすればよいですか?スケジュール変動はありません!

スケジュールを変更することに加えて、毎日実行するようにスケジュールされたcronジョブがあります。コマンドが期待どおりに実行されるかどうかをすぐにテストする他の方法はありますか?

編集:(コメントから)シェル(私のシェル)に入力すると、コマンドが正常に機能することがわかりますが、cronが実行されたときに正しく機能するかどうか疑問に思います。 ENVまたはシェル固有の項目(〜拡張子)の影響を受ける可能性があります。または所有権およびライセンス関連または...

答え1

次のコマンドを使用してcrontabを強制的に実行できます。

run-parts /etc/cron.daily

答え2

次の説明に従って、cronユーザーエクスペリエンスをシミュレートできます。「今すぐクローンジョブを手動で実行してください」。これにより、cronユーザーとして実行されたときにジョブがどのように機能するかをテストできます。


リンクから抜粋:


ステップ1:私は一時的にユーザーのcrontabに次の行を入れました。

* * * * *   /usr/bin/env > /home/username/tmp/cron-env

次に、ファイルが作成された後にファイルをインポートします。

ステップ2:私は自分の次のものを含むrun-as-cron bashスクリプトを自分で作成しました。

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

問題のユーザーとして、私は次のことができました。

    run-as-cron /the/problematic/script --with arguments --and parameters

答え3

私が知っている限り、cronには特定の時間にスケジュールされたコマンドを実行する特別な目的があるので、これを直接実行する方法はありません。したがって、最良の方法は、(一時的な)crontabエントリを手動で作成するか、環境を削除してリセットするスクリプトを作成することです。

「環境の削除とリセット」のガイドライン:

スクリプトを開始する前に、保存された環境を取得するラッパースクリプト(環境の削除)を開始できますenv -i(すべての変数をエクスポートし、可能であれば最初に設定する必要があります)。set -a

保存された環境はcronジョブのデフォルト環境になり、envcronjob(または使用されているcronジョブに応じてシェル)として実行され、その出力が保存されて記録されます。declare -p

答え4

cron ジョブを直接デバッグする必要があった後、次のスクリプトを作成しました。コマンドを実行する前に、cronとまったく同じ条件(変更された環境を含みますが、非対話型シェル、接続されていない端末などで動作します)をエミュレートすることをお勧めします。

コマンド/スクリプトを引数として呼び出すと、クローン操作を即時に簡単にデバッグできます。また、GitHubでもホストされ更新されます。run-as-cron.sh:

#!/bin/bash
# Run as if it was called from cron, that is to say:
#  * with a modified environment
#  * with a specific shell, which may or may not be bash
#  * without an attached input terminal
#  * in a non-interactive shell

function usage(){
    echo "$0 - Run a script or a command as it would be in a cron job," \
                                                       "then display its output"
    echo "Usage:"
    echo "   $0 [command | script]"
}

if [ "$1" == "-h" -o "$1" == "--help" ]; then
    usage
    exit 0
fi

if [ $(whoami) != "root" ]; then
    echo "Only root is supported at the moment"
    exit 1
fi

# This file should contain the cron environment.
cron_env="/root/cron-env"
if [ ! -f "$cron_env" ]; then
    echo "Unable to find $cron_env"
    echo "To generate it, run \"/usr/bin/env > /root/cron-env\" as a cron job"
    exit 0
fi

# It will be a nightmare to expand "$@" inside a shell -c argument.
# Let's rather generate a string where we manually expand-and-quote the arguments
env_string="/usr/bin/env -i "
for envi in $(cat "$cron_env"); do
   env_string="${env_string} $envi "
done

cmd_string=""
for arg in "$@"; do
    cmd_string="${cmd_string} \"${arg}\" "
done

# Which shell should we use?
the_shell=$(grep -E "^SHELL=" /root/cron-env | sed 's/SHELL=//')
echo "Running with $the_shell the following command: $cmd_string"


# Let's redirect the output into files
# and provide /dev/null as input
# (so that the command is executed without an open terminal
# on any standard file descriptor)
so=$(mktemp "/tmp/fakecron.out.XXXX")
se=$(mktemp "/tmp/fakecron.err.XXXX")
"$the_shell" -c "$env_string $cmd_string" > "$so" 2> "$se"  < /dev/null

echo -e "Done. Here is \033[1mstdout\033[0m:"
cat "$so"
echo -e "Done. Here is \033[1mstderr\033[0m:"
cat "$se"
rm "$so" "$se"

関連情報