nohup & ——Linux后台运行命令

在 Linux 终端上执行命令的通常风格是简单地运行它并等待它正常退出,命令退出后,可以继续连续执行其他命令,这就是所谓的在前台运行命令。正如这个词所暗示的那样,您可以在终端上直观地看到命令的输出。
而有时候我们并不在意命令的输出,而是要求命令执行的同时,在终端执行其他任务,这时候就要用到后台运行命令,nohup&就是两个比较常用的后台运行命令。

1.本节用到的其他知识

1)重定向

通常情况下我们想要后台挂起的任务都会产生输出打印在当前屏幕上,这会影响后面再当前shell执行其他操作,我们可以使用< << 重定向命令将输出日志进行转移。
重定向的具体知识详见这篇文章:commond >/dev/null 2>&1 命令详解

2)两种中断信号

关闭屏幕,执行CTRL+C等原因造成ssh断开造成正在运行程序退出,常常会使我们的工作功亏一篑。
其背后的主要原因在于上述的相关操作,shell默认会发送中断信号给该终端session关联的进程,从而导致进程跟随终端退出,为了弄清这个问题我们首先要了解两种中断信号:

  • sigint:signal interrupt,ctrl+c会发送此信号,主动关闭程序
  • sighup:signal hang up,关闭终端,网络断线,关闭屏幕会发送此挂断信号。

了解了程序退出的原因,接下来就是对这两种中断信号对应的解决办法。
用到的示例程序:test.sh

while true
do
	echo "I'm still here!"
	sleep 1
done

2.& 命令

&放在执行命令的最后,此时执行ctrl+c关闭就不会关闭此进程,但是当屏幕关闭、断网仍然会造成进程退出。
也就是免疫sigint信号,无法免疫sighup信号。
在这里插入图片描述

关闭当前shell会话,重新打开一个会话,查看进程会发现test.sh已经不在:
在这里插入图片描述

3.nohup 命令

nohup(no hang up),即不挂断运行,用nohup运行命令可以使命令永久执行下去,和用户终端没有关系,断开SSH不影响运行,nohup捕获了SIGHUP,并做了忽略处理,因此当屏幕关闭,断网等造成ssh中断时进程不会退出。但是ctrl+c可以关闭关闭该进程。
也就是也就是免疫sighup信号,无法免疫sigint信号。
在这里插入图片描述
此时关闭当前shell会话,在其他会话查看进程:
此时进程依旧存在。

还有一点需要提及,使用nohup默认会将标准输出重定向到~/nohuo.out文件中,shell窗口不在打印输出信息,此时我们读取一下nohup.out文件:
在这里插入图片描述
nohup.out可以自定义其他文件

nohup commond >file

4.结合使用

sigintsighup
&免疫不免疫
nohup不免疫免疫

既然两种命令分别对两种信号免疫,那将他们一起使用会是什么效果呢?在这里插入图片描述执行 Ctrl + C
在这里插入图片描述关闭当前会话,检测进程:在这里插入图片描述刚刚显示的[1]403进程依旧存在,最强钉子户诞生!
此时想要关闭进程的话,只能使用kill命令杀死进程了:
在这里插入图片描述


后记——screen

使用nohup + & 的方法是比较常用的后台运行手段,但也有它的局限性,如果一个进程需要与用户进行交互,等待用户输入,那就无法使用nohup + & 的方法了。对于这个需求,我的解决办法是使用screen,篇幅问题,在这里只说一下简略使用方法,下一篇文章再进行具体介绍吧。
1)新建会话

screen -S screenname        #新建一个叫screenname的session

2) 列出当前所有的session

screen -ls

3)回到某个会话

screen -r screenname

4) detach某个session

screen -d screenname            #远程detach某个session 
screen -d -r screenname         #结束当前session并回到screenname这个session

5)删除会话

screen -S pid-X quit
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nohup是一个Linux命令,用于在后台运行命令,即使用户退出或终端关闭,该命令也会继续运行。nohup命令通常与&符号一起使用,以便将命令放入后台运行nohup命令的语法如下: nohup command [arg...] [> output.file] [&] 其中,command是要运行的命令,arg是命令的参数,output.file是输出文件的名称,&符号表示将命令放入后台运行nohup命令通常用于长时间运行的命令,例如备份、编译、下载等。 ### 回答2: nohup是一种在Linux后台运行命令的方式,通常用于在关闭终端时仍然能够保持程序运行。在Linux中,所有的命令运行时都会使用终端窗口,如果关闭窗口或者退出终端,那么命令也会随之退出。但是,通过使用nohup命令,可以将一个命令或脚本的输出重定向到指定的文件,因此不会因为关闭终端而终止运行。 使用nohup命令非常简单,只需要在命令或脚本前加上nohup,并在后面指定输出文件即可: nohup command > output.txt & 其中,command是要执行的命令或脚本,output.txt是要输出的文件,&符号表示使命令后台运行。此时,关闭终端也不会终止命令的运行。 另外,如果想要杀死一个后台运行的进程,可以使用kill命令。可以通过ps命令查找进程的PID号,然后使用kill命令停止进程。例如: ps -ef | grep "command" 该命令将显示所有包含"command"关键字的进程。找到要停止的进程的PID号,然后使用kill命令停止进程: kill PID 此外,nohup命令还可以将进程的stdout/stderr输出到/dev/null(空设备节点),这样将不会生成任何输出文件。 nohup command > /dev/null 2>&1 & 以上命令将标准输出和错误输出重定向到空设备节点,不会产生输出文件,同时保持命令后台运行。 ### 回答3: nohupLinux中的一个命令,它用于在后台运行进程时,保证该进程不受终端断开的影响,从而使进程一直运行下去。其全称为“No Hang-Up”,意思是“不挂断”,通常用在需要长时间运行的命令上,比如用来进行数据分析、数据处理、文件备份等任务。nohup命令的格式为: nohup command [arg] & 其中,command表示要执行的命令,[arg]表示命令的参数,&表示将该命令放入后台执行。 nohup命令的使用方法如下: (1)使用nohup命令后,命令的输出会被重定向到一个文件nohup.out中,因此可以不必担心在退出终端后进程被关闭,还可以通过查看nohup.out文件来了解进程的运行状态。 (2)nohup命令可以与&符号结合使用,以使进程在后台运行。在使用nohup命令时,可以将待运行的命令括在一对引号之间,例如: nohup 'command arg1 arg2' & (3)如果要结束一个在后台运行nohup进程,可以使用kill命令,例如: kill -9 进程号 其中,进程号可以通过ps命令来查找。 需要注意的是,nohup命令并不能保证命令一定执行成功,它只是确保在命令执行过程中我们不必担心因为关闭终端而导致命令被中断。因此,在使用nohup命令时,需要对命令的执行结果进行监测,并在必要时采取相应措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值