タイマーによってトリガーされたシステムサービスは、常にそのプログラムを実行するわけではありません。

タイマーによってトリガーされたシステムサービスは、常にそのプログラムを実行するわけではありません。

システムタイマーに移動したい多くのcronジョブを実行しているサーバーがあります。 .serviceファイルと.timerファイルを生成する際に、次の問題が発生しました。CentOSでこのエラーが発生しました。(私たちが使っている)。同じ問題が発生しないように、.serviceファイルが時間と環境変数の値のみを印刷する単純なPythonスクリプトを指すように選択しました。数日間実行した結果、タイマー自体は時間内に動作しましたが、時には実際のサービスが実行されないことがありました。これは私のjournalctlユニットファイルの結果です。

Feb 03 15:52:28 li681-190 python3[12230]: Service "Business Script" ran at 2020-02-03 15:52:28.483885
Feb 03 15:52:28 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:53:46 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:53:46 li681-190 python3[12296]: Service "Business Script" ran at 2020-02-03 15:53:46.299353
Feb 03 15:53:46 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:55:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:55:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:56:01 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:56:01 li681-190 python3[12427]: Service "Business Script" ran at 2020-02-03 15:56:01.952895
Feb 03 15:56:01 li681-190 systemd[1]: Started business_script.py runner.
Feb 03 15:57:02 li681-190 systemd[1]: Starting business_script.py runner...
Feb 03 15:57:02 li681-190 python3[12539]: Service "Business Script" ran at 2020-02-03 15:57:02.790428
Feb 03 15:57:02 li681-190 systemd[1]: Started business_script.py runner.

ご覧のとおり、サービスがテストスクリプトを実行している場合やそうでない場合があります。ここで説明されているようにoneshotwithの使用にOnUnitActiveSec問題がある可能性があることを知っています。systemd問題6680コメント、まだ私にとってはうまくいくので変です。しかし、OnCalendarタイマーが実行されたときに常にサービスを開始しないいくつかのスクリプトがあります。私のサービスが常に実行されないのはなぜですか? CentOS 7-6.1810を実行しています。

私の.timerファイルは次のとおりです。

[Unit]
Description=Run business-script.py script every minute.
Requires=business-script.service

[Timer]
Unit=business-script.service
OnBootSec=1min
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

私の.serviceファイルは次のとおりです。

[Unit]
Description=timer_test.py runner
After=network.target

[Service]
User=business-script-user
Group=business-script-user
Type=oneshot

WorkingDirectory=/usr/local/bin/
ExecStart=/usr/bin/python3 timer-test.py
Environment='SERVICE_NAME="Business Script"'

[Install]
WantedBy=multi-user.target

私が書いたPythonスクリプトは次のようになります。

import datetime
import os


def main():
    service_name = os.getenv('SERVICE_NAME')
    now = datetime.datetime.now()
    print('Service {} ran at {}'.format(service_name, now))


if __name__ == '__main__':
    main()

答え1

だから、システム全体をチェックすることにしましたが、journalctlスクリプトは実際には実行されましたが、ユニットファイルにログインしていないことがわかりました。私の元の質問は今正しくありませんし、他の問題について追加の調査が必要だと思います。

この問題が発生した場合は、journalctl代わりにjournalctl -u your-unit.serviceサービスが実行されているという証拠を確認してください。

関連情報