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

时间:2010-12-06 18:51:58

标签: bash process daemon sleep detach

我要做的是在使用mac 命令之前写一段睡眠 Bash脚本一段时间说一些文字。

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

# Simple Example of main code
sleep 10;
say hello;
exit;

8 个答案:

答案 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。

因此,使用nohupdisown应该可以解决问题。或者你可以这样做:

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