这是我的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选项指定的单元的剩余进程.
如果你跑
[Service]
Type=simple
Run Code Online (Sandbox Code Playgroud)
比你需要的:RemainAfterExit = yes
或使用分叉:
[Service]
Type=forking
Run Code Online (Sandbox Code Playgroud)
小智 0
只需添加:RemainAfterExit=yes 它就像一个魅力