我正在通过SSH (Putty)在Linux机器上工作。我需要让一个进程在夜间运行,因此我认为可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到一个文件来实现这一点。

令我惊讶的是,这行不通。只要我关闭Putty窗口,进程就会停止。

我怎样才能防止这种情况发生?


当前回答

在基于debian的系统上(在远程机器上) 安装:

Sudo apt-get install tmux

用法:

tmux 运行您想要的命令

重命名会话:

按Ctrl+B然后$ 集名称

退出会话:

按Ctrl+B然后D

(这会留下tmux会话)。此时可以退出SSH。

当您需要再次返回/检查它时,启动SSH,并输入

Tmux附加session_name

它将带您回到tmux会话。

其他回答

当会话关闭时,进程接收到SIGHUP信号,但它显然没有捕捉到这个信号。您可以在启动进程时使用nohup命令,或者在启动进程后使用bash内置命令disown -h来防止这种情况发生:

> help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

在基于debian的系统上(在远程机器上) 安装:

Sudo apt-get install tmux

用法:

tmux 运行您想要的命令

重命名会话:

按Ctrl+B然后$ 集名称

退出会话:

按Ctrl+B然后D

(这会留下tmux会话)。此时可以退出SSH。

当您需要再次返回/检查它时,启动SSH,并输入

Tmux附加session_name

它将带您回到tmux会话。

对于大多数进程,您可以使用这个旧的Linux命令行技巧进行伪守护:

# ((mycommand &)&)

例如:

# ((sleep 30 &)&)
# exit

然后启动一个新的终端窗口,然后:

# ps aux | grep sleep

将显示睡眠30仍在运行。

您所做的是将该进程作为子进程的子进程启动,当您退出时,通常会触发该进程退出的nohup命令不会级联到子进程,使其成为一个孤儿进程,仍在运行。

我更喜欢这种“设置好就忘记”的方法,不需要处理nohup、screen、tmux、I/o重定向或任何类似的东西。

如果您想将详细信息记录到一个文件中,Nohup非常有用。但当它进入后台时,如果你的脚本要求,你无法给它一个密码。我想你一定要试一下屏幕。它是一个实用工具,你可以使用yum安装在你的linux发行版上,例如在CentOS上yum安装屏幕,然后通过putty或其他软件在你的shell类型屏幕上访问你的服务器。它将打开屏幕[0]在腻子。做好你的工作。你可以在同一个putty会话中创建更多的screen[1], screen[2]等。

你需要知道的基本命令:

启动屏幕

屏幕


创建下一个屏幕

ctrl + a + c


移动到您创建的下一个屏幕

ctrl + a + n


要分离

ctrl + a + d


在工作期间关闭腻子。下次当你登录通过putty类型

屏幕- r

重新连接到屏幕,您可以看到您的进程仍在屏幕上运行。要退出屏幕,输入#exit。

欲了解更多细节,请参阅男子界面。

使用屏幕。它使用起来非常简单,就像终端的vnc一样。 http://www.bangmoney.org/presentations/screen.html