在机器启动时使用哪种 systemd 服务类型我有些代码必须永远保留

which systemd TYPE of service to use at machine start i some code has to stay forever

在系统启动时,使用 systemd 服务, 我想永远启动 bash 到 运行,每 5 秒执行一次操作。

它的代码很简单(do_every_5_segons.sh)

    while true
    do
        {read some JSON from internet} >> $myLogFile  2>&1
        sleep 5
    done

所以,在我的服务定义中,我写了 (~/.config/systemd/user/r4_start.service )

    pi@R4:
    [Unit]
    Description=R4 start 
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    Restart=no
    WorkingDirectory=/home/pi/tools
    ExecStart=/home/pi/tools/r4_start.sh

然后在“r4_start.sh”中,我做了一些跟踪,然后启动我的 bash :

    nohup /home/pi/python/do_every_5_segons.sh &

需要“&”,以便在此行之后可以进行更多初始化。

“nohup”是必需的,因此 shell 在父端仍然存在。

我的问题是:

不要使用nohup。不要使用 &。不要将您的脚本包装在另一个脚本中。做前两件事中的任何一件都会阻止 systemd 检测程序何时崩溃并重新启动它,而第三件事会使信号处理复杂化。

使用Restart=always 创建一个 Install 部分,并将您的服务配置为在启动时启动的目标的依赖项。

[Unit]
Description=R4 start 

[Service]
WorkingDirectory=/home/pi/tools
ExecStart=/home/pi/tools/run-poll-loop
Restart=always

[Install]
WantedBy=multi-user.target

...其中 run-poll-loop 是可执行的 (chmod +x) 并且包含您的逻辑(注意,命令名称不应有扩展名;.sh is bad practice):

#!/usr/bin/env bash
while :; do
  # ...do whatever you need here...
  sleep 5
done

请注意,对于比每 5 秒延迟更慢的延迟,我建议使用 systemd 计时器 运行 一个每次只执行一次循环迭代的一次性服务;但是对于这么短的计时器,这将增加相当多的 process-startup 开销。