web-dev-qa-db-ja.com

テスト/デバッグのために、今すぐcronにジョブを実行させるにはどうすればよいですか?スケジュールを変更せずに!

スケジュールを変更する以外に、毎日実行するようにスケジュールされているcronジョブがあります。コマンドが意図したとおりに機能するかどうかを確認するために、コマンドを今すぐテスト実行する方法はありますか?

編集:(コメントから)シェル(私のシェル)に入力するとコマンドが正常に機能することを知っていますが、cronを実行したときにコマンドが正しく機能するかどうかを知りたいので、ENVまたはシェル固有のもの(〜展開)または所有権と許可に関するものまたは...

165
Ali

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

33
Ulrich Dangel

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

run-parts /etc/cron.daily
72
Vadim Sluzky

"cronジョブを手動ですぐに実行する" で説明されているように、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
54
Michael Barton

CronitorCLIにはコマンドcronitor selectを使用すると、コマンドラインから任意のcronジョブを選択して実行できます。使用するためにCronitorアカウントを作成する必要はありません。

https://cronitor.io/docs/using-cronitor-cli

次に例を示します。

ubuntu@ip-10-0-0-112:~$ cronitor select

Use the arrow keys to navigate: ↓ ↑
? Select job to run:
▸ /var/runner/src/bin/batch_reports.py runner.settings.prod
  /var/runner/src/bin/trigger_reports.py runner.settings.prod
  ... etc ...
6
Shane H

私の目的には少し良いと思われる解決策を見つけました(コマンドはCentOS/RHELのように表示されていますが、基本的にどこにでも適応できるはずです)。

これにはlibfaketimeが必要です- https://github.com/wolfcw/libfaketime のソースから自分でビルドするか、 https: //pkgs.org/download/libfaketime

  1. Crondサービスを停止します-service crond stop
  2. あなたのサービスがshouldrun by- https://crontab.gur がいつこれに役立つかを理解してください。
  3. Libfaketimeのfaketimeツールを使用して、フォアグラウンドモードでcrondを実行します(子プロセスの時間検索のために、syscallを偽造できます)。
    1. 私はこれを本番サーバーで実行しません
    2. faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x test,sch
[root@user-crontesting-dvc-01 ~]# faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x sch
debug flags enabled: sch
[4841] cron started
log_it: (CRON 4841) INFO (Syslog will be used instead of sendmail.)
log_it: (CRON 4841) INFO (RANDOM_DELAY will be scaled with factor 34% if used.)
log_it: (CRON 4841) INFO (running with inotify support)
[4841] GMToff=0
log_it: (CRON 4841) INFO (@reboot jobs will be run at computer's startup.)
[4841] Target time=1571299200, sec-to-wait=11
user [root:0:0:...] cmd="/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1"
[4841] Target time=1571299260, sec-to-wait=60
log_it: (root 4844) CMD (/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1)
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: syntax error near unexpected token `&')
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: `/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1')
1
javanix

あまりエレガントではありませんが、機能しています。これは、crontabの5行目でジョブを起動するために使用するものです。

 eval "$(crontab -l | sed -n '5p' | tr -s ' ' | cut -d' ' -f 6-)"

Crontabを表示し、5行目を取得し、複数のスペースを1つのスペースに置き換え、6列目から最後まですべてを取得して、evalで起動します。

0
Basj

serverfaultからの回答( 完全に表示 )を引用しています:


Crontabコマンドを一括で実行します。

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done

別のユーザーで実行するには:

Sudo -H -u username bash -c "crontab... "

0
T.Todua