Bash Systemd脚本不在ExecStart之后立即停止

Bash Systemd脚本不在ExecStart之后立即停止,bash,systemd,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 我不明白为什

以下是我的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
我不明白为什么它会按顺序执行(在系统启动时或手动启动时)ExecStart和ExecStop

你能帮我吗


提前感谢。

只需添加:RemainAfterExit=yes 如果你跑步,它就像一个符咒

[Service]
Type=simple
超出您需要的范围:RemainAfterExit=是

或使用分叉:

[Service]
Type=forking

Type=oneshot用于执行操作而不保持活动进程的单元,如文件系统检查或清理。此类systemd单元将等待ExecStart指定的进程终止,然后通过运行ExecStop指定的进程来停用

Type=simple(默认设置)在配置了ExecStart的进程是服务的主进程时使用。这些单元将等待ExecStart指定的进程返回,然后通过运行ExecStop指定的进程来停用

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


Type=forking用于在启动完成后预期退出由ExecStart指定的进程,而其子进程继续在后台运行。这是传统UNIX守护进程的行为,在您的案例中是推荐的选择。ExecStop设置是可选的,用于与服务通信以实现干净的终止。ExecStop指定的进程将在服务崩溃时运行。在没有任何ExecStop选项的情况下,
systemctl stop servicename
命令将按照KillMode选项的指定,简单地终止设备的剩余进程。

此选项属于on。祝你好运。不要从systemd运行实际调用你的服务的外部脚本。这行不通。让systemd实际启动服务。这不是一个好主意,因为如果进程被终止(未停止),它仍将显示为正在运行:RemainAfterExit=采用一个布尔值,指定即使在其所有进程退出时,服务是否应被视为活动的。默认为否。感谢您分享这一伟大的解释;这有帮助,干杯。如果可能的话,请您添加一些链接,以便理解systemctl。这里的ExecStop语义是否更改?我有“简单”和应用程序不断地打开和关闭,什么也不做。当我插入RemainAfterExist=yes时,它实际上运行了。谢谢@xsor!