linux 使进程后台运行:&/nohup/disown

在linux机器上工作,大多都是本地电脑通过xshell之类的工具连接到远端的linux主机上。当我们在终端或者控制台工作时,不希望由于运行比较耗时的作业而占用了当前屏幕;
也可能我们的电脑和远端的linux主机之间的网络不稳定,我们连接的终端随时可能断开,终端断开时,我们执行的命令也会终止,这是我们不希望的;
也可能我们启动的作业非常耗时了,快要下班了,等不及这个作业完成了,必须回家做饭吃,嗯,这个很重要,此时要是直接关闭终端,那么这个作业就会终止,以前的计算就白费了,这也是我们不希望的。
如何解决这些问题呢,下面一个一个来看。


解决方法:
我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。


hangup 名称的来由
在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。


& – 让命令后台运行

当我们在终端或者控制台工作时,如何让耗时的作业而不再占用了当前屏幕?
当在前台运行某个作业时,终端被该作业占据,此时可以在命令后面加上&实现后台运行。例如:

command > output.txt 2>&1 &

注意: 这个命令若需要和用户交互,就不能放在后台执行,因为这样你的命令就会卡在交互的地方;
命令运行可能输出结果到屏幕上,这样就干扰你工作,所以上面命令使用了“> output.txt 2>&1”,把结果重定向输出到指定文件中。

特别注意,使用这种方式时,若由于网络原因或者我们主动断开终端时,这个命令也会终止;
所以确信终端短时间内不会断开时,这种方式还是挺好用的。


nohup – 让提交的命令忽略hangup信号

使用&命令后,作业被提交到后台运行,当前终端/控制台没有被占用,但是一旦把当前终端关掉(退出账户时),提交的作业就会停止运行。nohup命令可以在你退出账户之后继续运行相应的进程。nohup就是不挂起(no hang up)的意思。
命令的一般形式为:

nohup command > output.txt 2>&1 &

注:使用了nohup之后,很多人就不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是
会自己结束的。所以在使用nohup后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。


disown – 脱离终端的子进程

我们已经知道,如果事先在命令前加上 nohup就可以避免 HUP信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?
这时想加nohup已经为时已晚,只能通过作业调度和disown来解决这个问题。


  • 使用 ctrl + z 把这个命令挂起(Suspend)
  • 使用 jobs 命令查看后端命令,只是你会发现这个命令是 stopped 状态
  • 使用 bg %N (注意,这个N是对应的编号),让这个命令后端执行
  • 再次使用 jobs 命令查看,发现那个命令的状态就变为 running 了,就是已经是后台执行了
  • 使用 disown -h %N,使这个进程运行在新的会话里,从而成为不属于此终端的子进程
  • exit正常退出这个终端

参考:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值