当前位置:  开发笔记 > 编程语言 > 正文

在Linux中,如何在关闭SSH客户端后阻止后台进程停止

如何解决《在Linux中,如何在关闭SSH客户端后阻止后台进程停止》经验,为你挑选了12个好方法。

我正在通过SSH(Putty)在linux机器上工作.我需要让一个进程在夜间运行,所以我想我可以通过在后台启动进程(在命令末尾有一个&符号)并将stdout重定向到文件来做到这一点.令我惊讶的是,这不起作用.一旦我关闭Putty窗口,该过程就会停止.

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



1> JesperE..:

查看" nohup "计划.


您可以使用`nohup command>/dev/null 2>&1&`在后台运行而不创建任何stdout或stderr输出(没有'nohup.out`文件)
登录并执行"kill ".如果你不知道pid,请使用"pidof".
你怎么在之后阻止它?

2> gpojd..:

我建议使用GNU Screen.它允许您在所有进程继续运行时断开与服务器的连接.在我知道它存在之前,我不知道我是如何在没有它的情况下生活的.


取决于您是否需要重新连接到后台应用程序.如果你这样做,那么,是的,屏幕是唯一的飞行方式.然而,如果这是一次又一次的冒险,那么nohup就能很好地满足这个要求,如果不是更好的话.
如果您喜欢屏幕,您可能也喜欢[tmux](http://tmux.sourceforge.net/).
这是我用过的最好的软件之一.认真.我把它放在一个BSD盒子上,我可以从任何地方进入,并且可以简单地重新连接到我的屏幕上,让我所有的终端都在我做各种各样的事情.

3> Robert Gambl..:

当会话关闭时,进程收到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.


这里的优点是disown适用于已经启动的进程.

4> anthonyrisin..:

守护进程?nohup的?屏幕?(tmux ftw,屏幕是垃圾;-)

只做其他应用程序从一开始就做的事情 - 双叉.

# ((exec sleep 30)&)
# grep PPid /proc/`pgrep sleep`/status
PPid:   1
# jobs
# disown
bash: disown: current: no such job

砰! 完成:-)我在所有类型的应用程序和许多旧机器上使用过无数次.您可以结合重定向和诸如此类的东西来打开您和流程之间的私人渠道.

创建为coproc.sh:

#!/bin/bash

IFS=

run_in_coproc () {
    echo "coproc[$1] -> main"
    read -r; echo $REPLY
}

# dynamic-coprocess-generator. nice.
_coproc () {
    local i o e n=${1//[^A-Za-z0-9_]}; shift
    exec {i}<> <(:) {o}<> >(:) {e}<> >(:)
. /dev/stdin <&$o 2>&$e
    $n=( $o $i $e )
COPROC
}

# pi-rads-of-awesome?
for x in {0..5}; do
    _coproc COPROC$x run_in_coproc $x
    declare -p COPROC$x
done

for x in COPROC{0..5}; do
. /dev/stdin <&\${$x[1]}
    read -r -u \${$x[0]}; echo \$REPLY
RUN
done

然后

# ./coproc.sh 
declare -a COPROC0='([0]="21" [1]="16" [2]="23")'
declare -a COPROC1='([0]="24" [1]="19" [2]="26")'
declare -a COPROC2='([0]="27" [1]="22" [2]="29")'
declare -a COPROC3='([0]="30" [1]="25" [2]="32")'
declare -a COPROC4='([0]="33" [1]="28" [2]="35")'
declare -a COPROC5='([0]="36" [1]="31" [2]="38")'
coproc[0] -> main
COPROC0 <- main
coproc[1] -> main
COPROC1 <- main
coproc[2] -> main
COPROC2 <- main
coproc[3] -> main
COPROC3 <- main
coproc[4] -> main
COPROC4 <- main
coproc[5] -> main
COPROC5 <- main

你去,产生什么.<(:)通过进程替换打开一个匿名管道,它会消失,但管道会因为你有一个句柄而四处乱窜.我通常做一个sleep 1而不是:因为它有点活泼,我会得到一个"文件忙"错误 - 如果运行一个真正的命令就不会发生(例如command true)

"heredoc采购":

. /dev/stdin <

这适用于我曾尝试过的每一个shell,包括busybox/etc(initramfs).我以前从未见过它,我在刺激时独立发现它,谁知道源可以接受args?但是,如果存在这样的事情,它通常可以作为一种更易于管理的评估形式.


无论你的回答有多好,有时候SO上的某个人都不喜欢它并且会投票.最好不要担心太多.
为什么要投票......如果这个问题已经过时了怎么办?考虑到其他11个答案很糟糕,这显然是相关的.这个解决方案是没有系统化的,过去30年来用于守护的惯用和可接受的方式,而不是毫无意义的应用程序,例如.nohup等.

5> Brian Knobla..:
nohup blah &

用你的进程名称代替等等!


nohup将stdout和stderr重定向到nohup.out(或者nohup.out和nohup.err,具体取决于版本),所以除非你运行多个命令,否则没有必要.
您可能希望添加重定向标准输出和标准错误.

6> Will Hartung..:

就个人而言,我喜欢'批处理'命令.

$ batch
> mycommand -x arg1 -y arg2 -z arg3
> ^D

这会将其填入后台,然后将结果邮寄给您.它是cron的一部分.



7> Jonathan Lef..:

正如其他人所指出的,要在后台运行进程以便可以断开与SSH会话的连接,您需要让后台进程正确地将其自身与其控制终端取消关联 - 这是SSH会话使用的伪tty.

您可以在书籍中找到有关守护进程的信息,例如Stevens的"高级网络程序,第1卷,第3版"或Rochkind的"高级Unix编程".

我最近(在过去几年)不得不处理一个没有正确守护自己的顽固计划.我最终通过创建一个通用的守护程序处理它 - 类似于nohup,但有更多的控件可用.

Usage: daemonize [-abchptxV][-d dir][-e err][-i in][-o out][-s sigs][-k fds][-m umask] -- command [args...]
  -V          print version and exit
  -a          output files in append mode (O_APPEND)
  -b          both output and error go to output file
  -c          create output files (O_CREAT)
  -d dir      change to given directory
  -e file     error file (standard error - /dev/null)
  -h          print help and exit
  -i file     input file (standard input - /dev/null)
  -k fd-list  keep file descriptors listed open
  -m umask    set umask (octal)
  -o file     output file (standard output - /dev/null)
  -s sig-list ignore signal numbers
  -t          truncate output files (O_TRUNC)
  -p          print daemon PID on original stdout
  -x          output files must be new (O_EXCL)

在不使用GNU getopt()函数的系统上,双破折号是可选的; 在Linux等上有必要(或者你必须在环境中指定POSIXLY_CORRECT).因为双破折号在任何地方都可以使用,所以最好使用它.

如果你想要源代码,你仍然可以联系我(gmail dot com的名字点最后一个名字)daemonize.

但是,代码是现在(终于)在我的GitHub上可用的SOQ(堆栈溢出问题)存储库中的文件daemonize-1.10.tgz在 包 的子目录.


你为什么不把源码放在github或bitbucket上?
@JonathanLeffler恕我直言,列出了一个程序的所有酷选项,这些选项在任何形式(甚至不是商业上)都没有公开可用,这会浪费读者的时间.
为什么缺少来自github的来源需要一个downvote?

8> Max..:

在基于Debian的系统上(在远程计算机上)安装:

sudo apt-get install tmux

用法:

TMUX

运行你想要的命令

要重命名会话:

按Ctrl + B然后$

设置名称

退出会话:

按Ctrl + B然后D

(这离开了tmux会话).然后,您可以注销SSH.

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

tmux附加session_name

它会带你回到你的tmux会话.



9> jcodeninja..:

如果父进程被终止,Nohup允许客户端进程被杀死,以便在您注销时进行参数.更好的还是使用:

nohup /bin/sh -c "echo \$\$ > $pidfile; exec $FOO_BIN $FOO_CONFIG  " > /dev/null

Nohup使您开始免受终止的过程,当您退出时,您的SSH会话及其子进程将被终止.我给出的命令为您提供了一种方法,您可以将应用程序的pid存储在pid文件中,以便以后可以正确地终止它并允许进程在您注销后运行.



10> Dana the San..:

如果您使用screen以root身份运行进程,请注意特权提升攻击的可能性.如果您自己的帐户以某种方式受到损害,将有一种直接的方式来接管整个服务器.

如果需要定期运行此进程并且您在服务器上具有足够的访问权限,则更好的选择是使用cron运行该作业.您也可以使用init.d(超级守护程序)在后台启动您的进程,它可以在完成后立即终止.



11> Adeel Ahmad..:

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

您需要了解的基本命令:

开始屏幕

屏幕

为了ç reate下一屏

CTRL + A + C

要移动到您创建的n ext屏幕

CTRL + A + N

d etach

CTRL + A + d

在工作期间关闭你的腻子.下次通过putty类型登录时

屏幕-r

要重新连接到屏幕,您可以在屏幕上看到您的进程仍在运行.并退出屏幕类型#exit.

欲了解更多详情,请参阅man screen.



12> 小智..:

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

# ((mycommand &)&)

例如:

# ((sleep 30 &)&)
# exit

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

# ps aux | grep sleep

将显示sleep 30仍在运行。

您所做的是从孩子的孩子开始的过程,当您退出时,nohup通常会触发该过程退出的命令不会级联到孙子,而将其作为孤立的过程继续运行。

我更喜欢这个“设置它和忘记它”的方法,无需处理nohupscreen,TMUX,I / O重定向,或任何东西。

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有