我要做的是在使用mac 说命令之前写一段睡眠 Bash脚本一段时间说一些文字。
我希望能够运行命令然后关闭终端,以便它仍然会在设定的时间发言。我已经研究过nohup,分离,启动并将进程置于后台,但所有这些解决方案仍然会导致终端关闭后终止进程。我应该以某种方式制作某种僵尸子进程来做到这一点吗?什么是最好的解决方案?谢谢
# Simple Example of main code
sleep 10;
say hello;
exit;
答案 0 :(得分:12)
Bash手册的第3.7.6节说:
shell收到SIGHUP后默认退出。在退出之前,交互式shell 将SIGHUP重新发送到所有正在运行或已停止的作业。已停止的作业将被发送到SIGCONT 确保他们收到SIGHUP。防止shell发送SIGHUP信号 对于一个特定的工作,应该使用disown builtin从jobs表中删除它(参见 第7.2节[Job Control Builtins],第88页)或标记为不使用
disown -h
接收SIGHUP。
因此,使用nohup
或disown
应该可以解决问题。或者你可以这样做:
trap "" 1
sleep 10
say hello
'trap
'行忽略信号1,SIGHUP;你也可以写“trap "" HUP
”。
答案 1 :(得分:11)
nohup yourscript.sh 10 "hello" &
# ^your script ^^your parameter 1
# ^^^^^^^your parameter 2
这将从终端分离脚本,终端关闭时不会被终止。注意最后的&
;您可以正常地将参数传递给脚本。然后yourscript.sh可能是:
#!/bin/bash
sleep $1;
say "$2";
exit;
答案 2 :(得分:6)
你需要一起使用nohup和背景。我只是在OS-X上尝试过这个来验证它是否有效:
nohup ./say-hello.sh &
答案 3 :(得分:3)
如果您没有按照建议使用nohup
启动它,则需要使用disown
......
$ ./say-hello.sh &
[1] 12345
$ disown -h %1
您需要记下作业编号(上例中的第二行,作业编号在括号中,另一行是流程ID),以便您可以将其传递给disown
。
答案 4 :(得分:2)
您的脚本可能如下所示:
#!/bin/bash
read -p "Text: " text
read -p "Delay: " delay
nohup bash -c "sleep $delay; say \"$text\" &"
然后你会正常运行你的脚本:
$ your_script
Text: hello
Delay: 10
并且外部脚本将退出,但 Sleep&Say™
将在后台运行。
答案 5 :(得分:1)
这里的所有解决方案都非常好,但它们并没有提供一种简单的方法来查看"如果没有重定向会填满硬盘,程序中会发生什么。
使用screen
,您可以非常轻松地运行脚本,关闭终端/ ssh会话,然后返回后者,并且"附加"再次到剧本。这样做很容易。
首先安装screen
:
sudo apt-get install screen
然后输入你的bash文件
#!/usr/bin/env bash
screen -S myscreen -d -m bash -c 'ls; exec bash'
(用您的程序替换ls
)它将创建(-S
)a"屏幕"命名为myscreen
,并通过运行``-c```选项中的命令将其分离(-d
)。然后,如果您想稍后连接到此屏幕:
screen -rd myscreen
如果要列出当前正在运行的所有屏幕:
screen -ls
注意:如果要在完成后关闭屏幕,请删除命令末尾的bash
。
答案 6 :(得分:0)
使用nohup yourscript.sh &
作为Piskvor的建议。
但请注意,您将无法重新获得对流程的“控制权”。因此,如果您确实需要它,我建议您将日志记录添加到文件中,以便了解您的程序正在执行的操作。
如果没有kill -9
,可能无法杀死您的计划,这可能有点残酷。如果你不想这样,我建议每分钟左右汇集一个像end.txt
这样的文件。如果您的程序在其工作目录中检测到存在此类文件,则应该正常退出。
答案 7 :(得分:0)
根据您对“简单”的定义,答案可能是daemon。