私はこのサービスを持っています:
[Unit]
Description=TimeAgent Recorder
Requires=timeagent.service
[Service]
User=deployer
Group=sudo
WorkingDirectory=/home/deployer/timeagent
Environment=HOME=/home/deployer
Environment=RAILS_ENV=production
Environment=EYE_CLIENT_TIMEOUT=120
Restart=always
RestartSec=15
Nice=1
Type=forking
PIDFile=/home/deployer/.eye/pid
ExecStart=/usr/local/bin/bundle exec eye load recorder.eye
ExecStop=/usr/local/bin/bundle exec eye quit --stop-all -t 600
[Install]
WantedBy=timeagent.service
再起動後、時々起動できません。
$ systemctl status timeagent-recorder
● timeagent-recorder.service - TimeAgent Recorder
Loaded: loaded (/etc/systemd/system/timeagent-recorder.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2017-03-20 16:30:17 GMT; 42min ago
Process: 10929 ExecStop=/usr/local/bin/bundle exec eye quit --stop-all -t 600 (code=exited, status=0/SUCCESS)
Process: 11409 ExecStart=/usr/local/bin/bundle exec eye load recorder.eye (code=killed, signal=TERM)
Main PID: 9236 (code=killed, signal=TERM)
Mar 20 16:30:16 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 20 16:30:17 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 20 16:30:17 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 20 16:30:17 Ti systemd[1]: Failed to start TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 20 16:30:20 Ti systemd[1]: Failed to start TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 20 16:30:20 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 20 16:30:20 Ti systemd[1]: Failed to start TimeAgent Recorder.
関連出力も次のとおりです。
$ systemctl show timeagent-recorder | grep -i restart
Restart=always
RestartUSec=15s
上記のように、サービスとデーモンの再ロードを有効にしたことを確認しました。有効で systemd はサービスを開始しようとしますが、RestartSec を完全に無視します。
私はUbuntu 16.04.1 LTSを使用しており、システムバージョンは229-4ubuntu10です。
RestartSec = 15が尊重されない理由をご存知ですか? - RestartSec = 15sを試してみましたが、違いはありませんでした。
編集する:
提案どおりに「必要」を「希望」に変更しましたが、問題は引き続き発生します。詳細を示す関連ログは次のとおりです。
# journalctl -f -u timeagent-recorder
Mar 26 20:18:21 Ti bundle[7030]: Config loaded!
Mar 26 20:18:21 Ti systemd[1]: Started TimeAgent Recorder.
Mar 26 22:17:06 Ti systemd[1]: Stopping TimeAgent Recorder...
Mar 26 22:17:08 Ti bundle[22989]: Eye quit ಠ╭╮ಠ (/home/deployer)
Mar 26 22:17:08 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:08 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:09 Ti bundle[23272]: Eye started! ㋡ (/home/deployer)
Mar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Control process exited, code=exited status=1
Mar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Unit entered failed state.
Mar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Failed with result 'exit-code'.
Mar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: Starting TimeAgent Recorder...
Mar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 26 22:17:10 Ti systemd[1]: Failed to start TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.
Mar 26 22:17:10 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.
Mar 26 22:17:10 Ti systemd[1]: Failed to start TimeAgent Recorder.
答え1
私はあなたが経験している行動があなたの依存関係のためだと思いますRequires=
。次のRequires=
セクションによるとman systemd.unit
:
他のデバイスのいずれかが無効または有効になっていない場合、このデバイスは無効になります。
ここで何が起こっているのか聞こえるようです。この段落の後半には、この状況に適用されるアドバイスがあります。
通常、失敗したサービスに対してシステムをより強力にするには、Requires =の代わりにWants =を使用することをお勧めします。
文書には次Wants=
のように記載されています。
Requires= の弱いバージョンです。ハイブがすでに起動している場合は、このオプションにリストされているデバイスが起動します。ただし、リストされているデバイスがアクティブでない場合やトランザクションに追加できない場合、これはトランザクション全体の有効性には影響しません。これは、あるデバイスの起動を別のデバイスの起動に接続するための推奨方法です。
別の方法で答え: "RequireSec ="条件が満たされず、systemdがサービスを終了するため、 "RequireSec ="ロジックを開始する機会がないと思います。
これは私の推測です。