从 Bash 脚本启动 systemctl,无需等待

ygo*_*goe 6 bash

我需要systemctl start myservice在 Bash 脚本接近结尾时调用,但我真的不关心它是否会成功或它何时返回。我只需要开始行动。监视该服务的状态是其他人的任务。我的脚本应该尽快返回,无论该服务是否已完成启动,我不依赖于此。

我的第一个想法是使用这样的东西:

# do other work
systemctl start myservice &
echo "done"
# end of script
Run Code Online (Sandbox Code Playgroud)

但我读到,这对于信号或在通常调用我的脚本的非交互式环境中是有问题的。所以我继续阅读并找到了该nohup命令,但这似乎会在任何地方写入输出文件,并且如果您不从 /dev/null 重定向标准输入,可能会挂起,他们说。

所以我仍然不知道如何正确地做到这一点。我愿意采用一种通用的方式来从 Bash 脚本启动并忘记任何进程,或者systemctl特别地,因为这将是我目前唯一的用例。

ygo*_*goe 11

我找到了一个非常简单的解决方案:

systemctl start --no-block myservice
Run Code Online (Sandbox Code Playgroud)

--no-block选项可用于启动、停止等,并且它不会等待实际过程完成。更多详细信息请参见 的联机帮助页systemctl


Dav*_*ica 1

如果您只是想启动systemctl并且不想等待,请使用exec调用来替换当前进程systemctl。例如,无需将进程置于后台,只需使用:

exec systemctl ....
Run Code Online (Sandbox Code Playgroud)

您可能希望包含该--no-pager选项以确保进程不会通过管道传输到寻呼机,这会阻止等待用户输入,例如

exec systemctl --no-pager ....
Run Code Online (Sandbox Code Playgroud)

当然,你的echo "done"愿望永远不会实现,但这与你的剧本无关。