Systemd脚本在ExecStart之后立即执行ExecStop

S4r*_*g0n 10 bash systemd

这是我的Systemd脚本:

[Unit]
Description=RDS Services

[Service]
WorkingDirectory=/home/rdsdb2/script_rds/
Type=oneshot
ExecStart=/bin/bash start_services.sh
ExecStop=/bin/bash stop_services.sh
KillMode=process

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚它为什么顺序执行(在系统启动时或手动启动时)ExecStart和ExecStop.

你能帮助我吗?

提前致谢.

小智 20

Type = oneshot用于单元,例如文件系统检查或清理,它们在不保持活动进程的情况下执行操作.这样的systemd单元将一直关闭,直到ExecStart指定的进程终止,然后通过运行ExecStop指定的进程停用.

当使用ExecStart配置的进程是服务的主进程时,将使用Type = simple(缺省设置).这些单元将一直等到ExecStart指定的进程返回,然后通过运行ExecStop指定的进程来停用.

使用RemainAfterExit = yes,即使所有进程都已返回,该服务也将被视为活动状态,因此ExecStop指定的进程不会自动运行.但是,建议不要使用此设置,因为即使服务已崩溃,服务仍将显示为处于活动状态.默认情况下禁用此设置.

ExecStart指定的进程在启动完成后退出时,使用Type = forking,而其子进程继续在后台运行.这是传统UNIX守护进程的行为,也是您的案例中的推荐选择.该ExecStop设置是可选的,并使用一个干净的终止服务进行通信.ExecStop指定的进程将在服务崩溃的情况下运行.在没有任何ExecStop选项的情况下,systemctl stop servicename命令将简单地终止KillMode选项指定的单元的剩余进程.


xso*_*sor 7

如果你跑

[Service]
Type=simple
Run Code Online (Sandbox Code Playgroud)

比你需要的:RemainAfterExit = yes

或使用分叉:

[Service]
Type=forking
Run Code Online (Sandbox Code Playgroud)


小智 0

只需添加:RemainAfterExit=yes 它就像一个魅力

  • 这不是一个好主意,因为如果进程被终止(而不是停止),它仍然会显示为正在运行: RemainAfterExit= 采用一个布尔值,指定即使服务的所有进程都退出,服务是否也应被视为活动的。默认为否。 (2认同)