スケジュールを変更する以外に、毎日実行するようにスケジュールされているcronジョブがあります。コマンドが意図したとおりに機能するかどうかを確認するために、コマンドを今すぐテスト実行する方法はありますか?
編集:(コメントから)シェル(私のシェル)に入力するとコマンドが正常に機能することを知っていますが、cronを実行したときにコマンドが正しく機能するかどうかを知りたいので、ENVまたはシェル固有のもの(〜展開)または所有権と許可に関するものまたは...
私が知る限り、cronには特別な目的があるため、直接実行する方法はありません。特定の時間にスケジュールコマンドを実行することです。したがって、最善の方法は、手動でcrontabエントリを作成するか、環境を削除してリセットするスクリプトを記述することです。
次のコマンドを使用して、crontabを強制的に実行できます。
run-parts /etc/cron.daily
"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
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 ...
私の目的には少し良いと思われる解決策を見つけました(コマンドはCentOS/RHELのように表示されていますが、基本的にどこにでも適応できるはずです)。
これにはlibfaketime
が必要です- https://github.com/wolfcw/libfaketime のソースから自分でビルドするか、 https: //pkgs.org/download/libfaketime 。
service crond stop
faketime
ツールを使用して、フォアグラウンドモードでcrondを実行します(子プロセスの時間検索のために、syscallを偽造できます)。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')
あまりエレガントではありませんが、機能しています。これは、crontabの5行目でジョブを起動するために使用するものです。
eval "$(crontab -l | sed -n '5p' | tr -s ' ' | cut -d' ' -f 6-)"
Crontabを表示し、5行目を取得し、複数のスペースを1つのスペースに置き換え、6列目から最後まですべてを取得して、eval
で起動します。
serverfaultからの回答( 完全に表示 )を引用しています:
Crontabコマンドを一括で実行します。
crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done
別のユーザーで実行するには:
Sudo -H -u username bash -c "crontab... "