linux 后台运行_Linux进程后台运行的3种方法

软硬件环境

  • ubuntu 18.04 64bit
  • nohup
  • setsid
  • screen

简介

经常会碰到这样的问题,用ssh登录远程的Linux服务器,运行了一些耗时的任务,结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口或者网络断开连接的干扰呢?本文介绍一些应对方法,您可以针对不同的场景选择不同的方式来处理这个问题。

解决方法

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

nohup

我们第一个想到的方法就是nohup,顾名思义,nohup的用途就是让提交的命令忽略hangup信号,命令是使用也是非常的简单,只要在你要执行的任务之前加上nohup即可,标准输出和标准错误缺省会被重定向到nohup.out文件中

nohup ping 192.168.1.1

7ef72ae17ccf0d812ec2ae5e78d5778e.png

此时nohup.txt文件内容如下

581b815b0ba1306ad06d955394901765.png

关闭ssh连接,然后重新登录,发现ping的进程还在后台运行

4a32d819716a366eb34fbcdf02e709a2.png

setsid

如果我们的进程不属于接受HUP信号的终端的子进程,那么自然也就不会受到HUP信号的影响了,setsid就能帮助我们做到这一点。setsid使用跟nohup非常类似,加在任务命令之前就可以了

setsid ping 192.168.1.1

通过命令ps -ef | grep ping,可以看到ping进程的进程号是5209,父进程的进程号是1,在linux系统中,1是init进程的进程号。此时的ssh进程号是

1eb3f5bf250a20c8a3fae1d457a6413f.png

b594437274d22e77684c7403a59e8e75.png

screen

screen提供了ANSI/VT100的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen的参数很多,具有很强大的功能,我们在此仅介绍其常用功能,更纤细的使用方法请参阅其帮助文档。

ubuntu中安装screen

sudo apt install screen

screen常用命令

  • screen -dmS test 创建一个名叫test的处于断开模式下的会话
  • screen -list 来列出所有会话
  • screen -r test 重新连接test会话

当我们用-r连接到screen会话后,我们就可以在这个伪终端里面为所欲为,再也不用担心HUP信号会对我们的进程造成影响,也不用给每个命令前都加上nohup或者setsid

screen -dmS xgxscreen -r xgxping 192.168.1.1

899c05ef6114cb4773551322cce7f6a9.png

此时用pstree查看

18603ddf17b22461fc26b5f019c7ef43.png

可以看到ping进程是screen的子进程,而screeninit的子进程,那么当ssh断开连接时,HUP信号自然就不会影响到screen下面的子进程了

参考资料

  • https://www.gnu.org/software/screen/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值