こんにちは、毎秒foo.serviceを実行するためにfoo.timerを定義しました。
私のオペレーティングシステムのバージョンはcentos7u2です。
#systemctl --version
systemd 219
-PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
#systemctl cat foo.timer
# /etc/systemd/system/foo.timer
[Unit]
Description=Run foo weekly and on boot
[Timer]
OnBootSec=15min
OnUnitActiveSec=1s
AccuracySec=1us
[Install]
WantedBy=timers.target
私が実行したものを見てください:
#systemctl cat foo.service
# /etc/systemd/system/foo.service
[Unit]
Description=test
[Service]
Type=oneshot
ExecStart=/usr/lib/aa.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
スクリプト:
#cat /usr/lib/aa.sh
#!/bin/sh
aa=`date`
echo $aa >> /var/log/aa.log
ログファイル:
Mon Jul 3 20:28:36 HDT 2017
Mon Jul 3 20:28:37 HDT 2017
Mon Jul 3 20:28:38 HDT 2017
Mon Jul 3 20:28:44 HDT 2017
Mon Jul 3 20:28:45 HDT 2017
Mon Jul 3 20:28:46 HDT 2017
Mon Jul 3 20:28:47 HDT 2017
Mon Jul 3 20:28:48 HDT 2017
Mon Jul 3 20:28:54 HDT 2017
Mon Jul 3 20:28:55 HDT 2017
Mon Jul 3 20:28:56 HDT 2017
Mon Jul 3 20:28:57 HDT 2017
Mon Jul 3 20:28:58 HDT 2017
このログファイルを見ると、5秒のコンテンツが失われたことがわかります。 OnUnitActiveSec = 2sを試しましたが、この問題は発生しませんでした。なぜですか?
答え1
私はこのタイマーを問題なく使用しているので、systemdがタイミングに厳密に従わないことがわかりました。
Description=Timer
[Service]
Type=simple
ExecStart=/bin/sh -c "while true ; do echo Timer; usleep 500000; done"
Restart=always
RestartSec=1
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
デフォルトでは無限ループですが、安定性のために停止した場合は、1秒以内に再開するように設定します。