ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux后台任务运行的方法

2022-01-10 19:33:33  阅读:229  来源: 互联网

标签:screen 作业 终端 信号 Linux 进程 后台任务 运行 nohup


Linux后台任务运行的方法

最近在远程服务器跑算法模型,远程服务器的工具我用的是MobaXterm,推荐推荐,很好用~

言归正传,跑算法模型要好久,因为服务器性能不是很好,我跑一次要好几天,那就难免远程连接服务器工具会断开,这时候跑了几天的这个模型进程就无了…,也差点把我气的送走~~

最后,自己知道了如何后台运行,恩,真香,自己也就调研学习了一下Linux后台运行任务的方法,在现在跑模型的时候也使用了其中的一种,余下几种自己玩了玩,来记录一下,方便下次看~,学到的方法写在总结里哦!!

1、原理知识剖析(问题引出)

问题:

  • 为什么远程工具断了,进程就没了呢?
  • 为什么我们平时用ctrl+c,那进程也就断了呢?

为了来探究这两个问题,我们首先要了解一下Linux的一些信号,我们可以在终端输入以下命令来查看:

kill -l

请添加图片描述

可以看到总共有64个信号,我们一般称1 ~ 31的信号为不可靠信号,传统UNIX支持的非实时的信号;32 ~ 64为可靠信号,即后来扩充的可靠信号,两者的区别是不可靠信号不支持排队,从而可能会造成信号丢失,而可靠信号则不会。下面介绍几个终端常见到的几个(大家可以试试,看看都是什么效果):

1) SIGHUP:本信号在用户终端连接(正常或非正常)结束时发出

2) SIGINT:程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
 
3) SIGQUIT:与SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制

9) SIGKILL:用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果某个进程终止不了,发送这个信号

20) SIGTSTP:停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

而上面两个问题背后的主要原因会涉及到SIGHUP 、SIGINT信号,下面说明原因:

原因:在我们登录Linux服务器的时候,系统会分配给我们一个终端,也就是一个Session。在我们登录成功之后,我们运行的所有程序,无论是前台进程还是后台进程一般都属于这个Session,那如果我们关闭了终端或者用了ctrl+c,shell默认会发送中断信号给该终端Session关联的进程,从而导致进程终止。

  • sighup: signal hang up,用户退出Linux登录时或者关闭终端时候,若有对终端输出的进程,其将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此该向终端输出的进程就会中止。不过可以对这个信号进行捕获,比如wget能捕获SIGHUP信号并忽略它,这就是为什么就算退出了Linux登录,wget也能继续下载的原因
  • sigint: signal interrupt,ctrl+c 会发送此信号,主动关闭程序

2、问题处理

在上面我们知道了:

  • 远程工具断了,发送了sighup信号,进程没了
  • Ctrl+c发送 sigint ,那进程也没了

那首先想到的就是,我执行上面的操作,我不让其发送信号不就好了?或者说,你发送信号,我采取机制忽略你?这就对应有两个东西的出现:

2.1 忽略sigint信号(& 符号)

第一种,我们让启动的程序忽略sigint信号,从而让导致进程关闭的sigint信号无效,那就用到了 & 符号

例如:(是不是real简单,哈哈哈哈哈)

tail -f logs.log &

2.2 忽略sigup信号(nohup)

介绍一种命令:nohup ,英文全称 no hang up(不挂起),我们可以用这个命令来使任务不挂断一直在系统后台运行

原理:nohup捕获了SIGHUP信号,对其进行了忽略,从而让发送能让进程关闭sigup信号的操作无效

nohup的命令语法:

nohup Command [ Arg … ] [ & ]
  • Command:要执行的命令。
  • Arg:可选,一些参数,可以指定输出文件。
  • &:可选,让命令在后台执行

在默认情况下(没有指定输出文件的时候)会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

使用:

nohup tail -f logs.log

其他使用(指定输出文件):

nohup ./example.sh > logs.log 2>err.log

后台不中断执行./example.sh,正常stdout输出给logs.log,错误stderr输出给err.log日志中

官网对这里的相关的数字含义解释如下:

  • 0 – stdin (standard input,标准输入)
  • 1 – stdout (standard output,标准输出)
  • 2 – stderr (standard error,标准错误输出)

官网的一种举例,其含义是将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中

nohup /root/runoob.sh > runoob.log 2>&1 &

也可以看到,一般我们将nohup命令与&符合结合起来使用。那么这两个信号都没有作用了,very nice,我现在也是喜欢用这个方法来跑模型,把日志输出我自己的输出日志中,体验感不错~

2.3 不接受sigup信号(setsid命令)

介绍一种命令:setsid ,可以用这个命令重新创建一个session,让子进程继承父进程的SessionId,但可以脱离父进程,不受负进程控制

原理:nohup 可以通过忽略 HUP 信号来使我们的进程避免中途被中断,但角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了,setsid 就是这样的

setsid的命令语法:

setsid Command [ Arg … ]
  • Command:要执行的命令。
  • Arg:可选,一些参数

使用:

setsid tail -f logs.log

我们来查看进程看看:

请添加图片描述

可以看到:

  • 我们终端的进程ID是20953,框框上面的是上面的几种后台任务进行的方式产生的,可见各自的进程ID不同,但是父进程ID都是20953
  • 而框框是执行setsid得到的,进程 ID(PID)为22161,而它的父 ID为1,并不是当前终端的进程 ID 20953

3、其他的方法

下面介绍几种其他的方法:

  • .ctrl + z、jobs、fg、bg(任务调度的方式)
  • screen (多重视窗管理程序)
  • tmux (终端复用软件)

3.1 任务调度的方式

在上面有一个信号 SIGTSTP 主要是 来使终端输出的进程停止,也就是挂起,我们可以使用 Ctrl+Z来发送这个信号

例如:我们tail查看一个日志的时候,按下Ctrl+Z,会对应有一个 Stopped,【1】为其作业号,我们在将其重新运行的时候就用到这个作业号

请添加图片描述

所以针对这种情况,我们挂起,肯定有重新运行,所以这就涉及到了几个命令:

  • jobs:查看当前有多少在后台运行的命令
  • fg:将后台中的作业进程调至前台继续运行
  • bg:将后台中暂停(挂起)的作业进程继续运行

举例使用:

>jobs

[1]+  Stopped                 tail -f /home/hiudawn/mlpan/faster-rcnn/logs/res.log

>fg 1 # 重新运行作业号为1的作业

tail -f /home/hiudawn/mlpan/faster-rcnn/logs/res.log

>bg 1 # # 重新运行挂起的作业号为1的作业(后台运行)
[1]+ tail -f /home/hiudawn/mlpan/faster-rcnn/logs/res.log &

3.2 screen

官方解释:screen命令用于多重视窗管理程序。screen为多重视窗管理程序。此处所谓的视窗,是指一个全屏幕的文字模式画面(终端页面)。通常只有在使用telnet登入主机或是使用老式的终端机时,才有可能用到screen程序。

粗略解释:可以粗略地认为screen是一个虚拟终端软件,它直接在linux系统里面启动了另外一个后台程序接管(维持)了你的这个终端会话,当你直接连接的终端ssh断开时他仍然让程序认为你的ssh持续链接着,这样也就不会出现进程接收到中断信号而退出。

语法:

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]

解释

  • [-AmRvx -ls -wipe]
    • -A  将所有的视窗都调整为目前终端机的大小。
    • -m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
    • -R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
    • -v  显示版本信息。
    • -x  恢复之前离线的screen作业。
    • -ls或–list  显示目前所有的screen作业。
    • -wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。
  • -r <作业名称>  恢复离线的screen作业。
  • -d <作业名称>  将指定的screen作业离线。
  • -h <行数>  指定视窗的缓冲区行数。
  • -s  指定建立新视窗时,所要执行的shell。
  • -S <作业名称>  指定screen作业的名称。

使用:

(1)在使用前需要先安装:

apt-get install  screen

yum install  screen

(2)常用选项:

  • screen -dmS name来建立一个处于断开模式下的会话(并指定其会话名name)。
  • screen -list来列出所有会话。
  • screen -r name来重新连接指定会话(连接会话名为name的会话)
  • 用快捷键CTRL+d来暂时断开当前会话

例如:(简单使用,创建几个会话)

请添加图片描述

可以自己试试效果 screen -r u 连接u会话就可以干一些想干的事情了~~,下面我们看看进程的变化

1. 未使用 screen 时新进程的进程树
(base) hiudawn@1060:~$ ping www.google.com &
[1] 9499
(base) hiudawn@1060:~$ pstree -H 9499
init─┬─Xvnc
├─acpid  
├─atd  
├─2*[sendmail]   
├─sshd─┬─sshd───bash───pstree   
│      └─sshd───bash───ping

我们可以看出,未使用 screen 时我们所处的 bashsshd 的子进程,当 ssh 断开连接时,HUP 信号自然会影响到它下面的所有子进程(包括我们新建立的 ping 进程)。

2. 使用了 screen 后新进程的进程树
(base) hiudawn@1060:~$ screen -r u
(base) hiudawn@1060:~$ ping www.ibm.com &
[1] 9488
(base) hiudawn@1060:~$ pstree -H 9488
init─┬─Xvnc   
├─acpid
├─atd   
├─screen───bash───ping   
├─2*[sendmail]

而使用了 screen 后就不同了,此时 bashscreen 的子进程,而 screen 是 **init(PID为1)**的子进程。那么当 ssh 断开连接时,HUP 信号自然不会影响到 screen 下面的子进程了。

3.3 tmux

Tmux是一个优秀的终端复用软件,类似screen,我们通过一个终端登录远程主机然后并运行tmux后,可开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机。其可以说是Screen的替代品。tmux的功能很多,很复杂,具体的可以查看 这篇文章 tmux终端复用详解,这里不再细说了 。

语法:

tmux [-2CluvV] [-c <shell>] [-f file] [-L socket-name] [-S socket-path] [command [flags]]

总结

  • & 符号:忽略sigint信号
  • nohup命令:忽略sigup信号
  • setsid命令:开启新session,不接受sigup信号
  • .ctrl + z、jobs、fg、bg:任务调度的方式
  • screen :多重视窗管理程序
  • tmux :终端复用软件

标签:screen,作业,终端,信号,Linux,进程,后台任务,运行,nohup
来源: https://blog.csdn.net/weixin_42272869/article/details/122417291

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有