这是我的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。
你能帮助我吗?
提前致谢。
答案 0 :(得分:14)
Type = oneshot 用于单元,例如文件系统检查或清理,它们在不保持活动进程的情况下执行操作。此类系统单元将在 ExecStart 指定的进程终止之前关闭,然后通过运行 ExecStop 指定的进程停用。
当 ExecStart 配置的进程是服务的主进程时,使用Type = simple (默认设置)。此类单位将等待 ExecStart 指定的流程返回,然后通过运行 ExecStop 指定的流程停用。
使用 RemainAfterExit = yes ,即使所有进程都已返回,该服务也会被视为活动状态,因此 ExecStop 指定的进程不会自动运行。但是,建议不要使用此设置,因为即使服务已崩溃,服务仍将显示为处于活动状态。默认情况下禁用此设置。
当 ExecStart 指定的进程在启动完成后退出并且其子进程继续时,将使用Type = forking 在后台运行。这是传统UNIX守护进程的行为,也是您的案例中的推荐选择。 ExecStop 设置是可选的,用于与服务通信以进行彻底终止。如果服务崩溃, ExecStop 指定的进程将运行。在没有任何 ExecStop 选项的情况下, systemctl stop servicename 命令将简单地终止该单元的剩余进程,如 KillMode 选项所指定的那样
答案 1 :(得分:6)
如果你跑
[Service]
Type=simple
比你需要的:RemainAfterExit = yes
或使用分叉:
[Service]
Type=forking
答案 2 :(得分:1)
添加:RemainAfterExit = yes 它像魅力一样工作