我有一个软件,基本上可以连续分析相机流并将一些信息发送到服务器,这是一个无头系统(Ubuntu 16.04)。申请必须每天(周日除外)上午 7:30 开始,晚上 10 点停止。该应用程序必须在该时间窗口内的任何时间运行,因此必须在崩溃和断电的情况下重新启动(托管该软件的计算机设置为断电后开机),但前提是我们处于时间窗口。目前我正在使用这些 cronjobs
* 7-21 * * 1-6 check-software.sh
00 22 * * 1-6 killall mysoftware
check-software.sh 看起来像:
#!/bin/bash
check_process() {
if ps aux | grep "[m]ysoftware"
then
return 1
else
return 0
fi
}
check_process
if (test $? -eq 0)
then
echo mysoftware not running
./mysoftware
else
echo mysoftware running
fi
它工作正常,但我想使用 systemd 服务而不是 cron..所以我尝试以这种方式将服务与计时器一起使用。
myservice.service
在.config/systemd/user
[Unit]
Description=My Software
StartLimitInterval=0
[Service]
Type=simple
Restart=always
RestartSec=10
WorkingDirectory=/opt/mysoftware
ExecStart=/opt/mysoftware/mysoftware
ExecStartPost=/home/myuser/clear_timer.sh
mytimer.timer
在.config/systemd/user
[Unit]
Description=Run my software
[Timer]
OnCalendar=Mon-Sat 07:29:00
Persistent=true
[Install]
WantedBy=timers.target
clear_timer.sh
这是:
#!/bin/bash
rm ~/.local/share/systemd/timers/*
export XDG_RUNTIME_DIR=/run/user/1000
systemctl --user restart mytimer.timer
在我看来,clear_timer 应该可以解决这个问题,删除计时器的最后一次执行,这样当断电时,如果经过了 7:30,计时器就会意识到它以前从未触发过并触发。然而这不起作用!如果 7:30 之后断电,则软件不会启动,否则此方法将按预期工作(但我总是需要一个 cronjob 在晚上 10 点停止软件)。任何想法?