B站: 迷途小书童的Note;微信公众号: Dev_Club;个人微信:xituxiaoshutong100

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

Linux 迷途小书童 0评论

软硬件环境

视频看这里

此处是youtube的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。

简介

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

解决方法

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

nohup

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

nohup ping 192.168.1.1

此时nohup.txt文件内容如下

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

setsid

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

setsid ping 192.168.1.1

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

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 xgx
screen -r xgx
ping 192.168.1.1

此时用pstree查看

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

参考资料

微信公众号

wechat

B站

bilibili

微信

wechat

喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址