web-dev-qa-db-ja.com

1445分ごとにCronjob

まず、私の悪い英語でごめんなさい。私はCrontabに初めて参加し、いくつかのスケジュールを立てていました。私はPythonでインターネットからいくつかのデータをこすり取っていました、そして私はこのウェブサイトを持っています、あなたがいくつかのデータをこするとき、あなたはデータの次の部分を取得するためにちょうど24時間待たなければならないので毎日00.00から始まり、Seleniumを実行してデータをスクレイピングするのに数秒かかります。次の日は、数秒オフセットして実行して、ジョブを実行した瞬間から24時間ではなく、スクレイピングを行ったときから24時間後にパスを確認する必要があります。それで、前日から5分遅れて毎日ジョブを実行する方法はありますか、またはpythonスクリプトで毎日より長くスリープするようにする必要があります。

長い投稿でごめんなさい

4
djsony90

または、私はpythonスクリプトで何かを毎日作成する必要があります。

おそらく最も簡単です。 cronは時間内の変数を処理できません。 atコマンドは、スクリプトを開始する必要があるときほど柔軟です。必要なのは、

at midnight + 1 minute < {script}

1は、開始した日に基づいて増加する変数です(1日目は+1分、2日目は+2分など)。いつか問題が発生することを覚えておいてください。60* 24 = 1440日では、次の真夜中を過ぎて実行することになります。そのスクリプトをcronに追加します。

もあります at -tここで、cronを必要としない通常のコマンドになる時間を設定します。

at -t 201903300000
at -t 201903310001    
at -t 201903010002
...
at -t 201912310410 

(2019年3月3日の0:00、31.3の0:00の1分後、1.4の0:00の2分後など)

3
Rinzwind

目標を達成する別の可能な方法は、systemdtimer unitsservice unitsを使用することですa cronjob

ファイル/etc/systemd/system/my-script.timer

[Unit]
Description=Timer for MyScript

[Timer]
OnBootSec=2min
OnUnitInactiveSec=1day 5min

[Install]
WantedBy=multi-user.target

ファイル/etc/systemd/system/my-script.service

[Unit]
Description=MyScript

[Service]
Type=oneshot
ExecStart=/path/to/my-script.sh

次に、次のコマンドを実行します。

Sudo systemctl daemon-reload
Sudo systemctl enable --now my-script.timer

これにより、タイマーユニットが有効になり(=起動時に自動開始)、すぐに開始されます。

タイマーユニットはサービスユニットを制御します。つまり、システムが起動してから2分後に同じ名前のサービスユニット(my-script)を開始し、それからサービスユニットを1日5分再起動します。サービスユニットが非アクティブになった(=停止した)後。

起動時間が過去2分を超えると、タイマーがすぐにアクティブになります。

サービスユニットはユーザーrootとして実行されることに注意してください。これを変更するには、User=属性をサービスユニットに追加します。

[Unit]
Description=MyScript

[Service]
Type=oneshot
User=djsony90
ExecStart=/path/to/my-script.sh

ステータスを確認するには、次のコマンドを発行します。

systemctl status my-script.{timer,service}
● my-script.timer - Timer for MyScript
   Loaded: loaded (/etc/systemd/system/my-script.timer; enabled; vendor preset: enabled)
   Active: active (waiting) since Sun 2019-03-31 13:47:29 CEST; 19min ago
  Trigger: Mon 2019-04-01 13:52:59 CEST; 23h left

Mar 31 13:47:29 Host systemd[1]: Started Timer for MyScript.

● my-script.service - MyScript
   Loaded: loaded (/etc/systemd/system/my-script.service; static; vendor preset: enabled)
   Active: inactive (dead) since Sun 2019-03-31 13:47:59 CEST; 18min ago
  Process: 22833 ExecStart=/home/pduck/my-script.sh (code=exited, status=0/SUCCESS)
 Main PID: 22833 (code=exited, status=0/SUCCESS)

Mar 31 13:47:29 Host systemd[1]: Starting MyScript...
Mar 31 13:47:59 Host systemd[1]: Started MyScript.

ここで、タイマーユニットが有効になっており(起動時に開始することを意味)、現在19分間待機していることがわかります。サービスユニットは、約Mon 2019-04-01 13:52:59にアクティブになります。 23時間。サービスユニットは現在非アクティブです。 (私のテストスクリプトmy-script.shは単にsleep 30を実行します。)また、Sun 2019-03-31 13:47:59以降、サービスユニットが非アクティブであることがわかります。 1日と5分を追加すると、タイマーユニットのトリガー時間であるMon 2019-04-01 13:52:59が正確に得られます。

さらに読む:

3
PerlDuck

Cronを使用する代わりに、プログラムを呼び出すたびに1日と10秒間スリープする永続的なbashスクリプトを実行するだけで済みます。

#/bin/bash

while true
do
    ### invoke your program here ###
    sleep 1d 10s
done
1
Ray Butterworth