"分离/守护"Bash脚本的最简单方法是什么?

War*_*ing 16 bash sleep daemon process detach

我要做的是编写一个Bash脚本,在使用mac say命令说出一些文本之前,它会休眠一段时间.

我希望能够运行命令然后关闭终端,这样它仍然会在设定的时间说话.我已经研究过nohup,分离,启动并将进程置于后台,但所有这些解决方案仍然会导致终端关闭后终止进程.我应该以某种方式制作某种僵尸子进程来做到这一点吗?什么是最好的解决方案?谢谢

# Simple Example of main code
sleep 10;
say hello;
exit;
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 13

Bash手册的第3.7.6节说:

收到SIGHUP后,shell默认退出.在退出之前,交互式shell会将SIGHUP重新发送到所有正在运行或已停止的作业.停止的作业被发送SIGCONT以确保他们收到SIGHUP.为防止shell将SIGHUP信号发送到特定作业,应使用disown builtin将其从作业表中删除(参见章节7.2 [作业控制内置],第88页)或标记为不使用SIGHUP接收SIGHUP disown -h.

所以,使用nohup或者disown应该做的伎俩.或者你可以这样做:

trap "" 1
sleep 10
say hello
Run Code Online (Sandbox Code Playgroud)

那条trap线忽略了信号1,SIGHUP; 你也可以写'' trap "" HUP.


Pis*_*3.0 12

nohup yourscript.sh 10 "hello" &

#     ^your script  ^^your parameter 1
#                      ^^^^^^^your parameter 2
Run Code Online (Sandbox Code Playgroud)

这将从终端分离脚本,终端关闭时不会被终止.注意&最后; 您可以正常地将参数传递给脚本.然后yourscript.sh可能是:

#!/bin/bash

sleep $1;
say "$2";
exit;
Run Code Online (Sandbox Code Playgroud)


Lau*_*ves 6

你需要一起使用nohup和背景.我只是在OS-X上尝试过这个来验证它是否有效:

nohup ./say-hello.sh &
Run Code Online (Sandbox Code Playgroud)


Wil*_*ill 5

如果您没有nohup像已经建议的那样以开头,则需要这样使用disown...

$ ./say-hello.sh &
[1] 12345
$ disown -h %1
Run Code Online (Sandbox Code Playgroud)

您需要记下作业编号(上面示例中的第二行,作业编号在括号中,另一行是进程 ID),以便您可以将其传递给disown.