まず、私の悪い英語でごめんなさい。私はCrontabに初めて参加し、いくつかのスケジュールを立てていました。私はPythonでインターネットからいくつかのデータをこすり取っていました、そして私はこのウェブサイトを持っています、あなたがいくつかのデータをこするとき、あなたはデータの次の部分を取得するためにちょうど24時間待たなければならないので毎日00.00から始まり、Seleniumを実行してデータをスクレイピングするのに数秒かかります。次の日は、数秒オフセットして実行して、ジョブを実行した瞬間から24時間ではなく、スクレイピングを行ったときから24時間後にパスを確認する必要があります。それで、前日から5分遅れて毎日ジョブを実行する方法はありますか、またはpythonスクリプトで毎日より長くスリープするようにする必要があります。
長い投稿でごめんなさい
または、私は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分後など)
目標を達成する別の可能な方法は、systemdtimer unitsとservice 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
が正確に得られます。
さらに読む:
Cronを使用する代わりに、プログラムを呼び出すたびに1日と10秒間スリープする永続的なbashスクリプトを実行するだけで済みます。
#/bin/bash
while true
do
### invoke your program here ###
sleep 1d 10s
done