screen命令,让Linux进程在后台运行

 四六资源网   2022-08-13 22:56   1560 人阅读  1 条评论

首先理解任务是如何中断的

当我们关闭终端,shell默认会发送中断信号给该终端session关联的进程,从而导致进程跟随终端退出。

两种中断信号:

1)sigint:signal interrupt,ctrl+c会发送此信号,主动关闭程序

2)sighup: signal hang up,关闭终端,ssh掉线,关闭屏幕会发送此挂断信号。

几种后台运行任务的方法:

1)&符号

将&符号放在命令最后面,使启动的程序忽略sigint信号,此时执行ctrl+c不会关闭进程,但当断网或关闭终端时,仍会造成进程退出。

例:bash test.sh &

2)nohup指令

nohup(no hang up),指不挂断运行,使用nohup在后台执行任务,和用户终端没有关系,所以断开ssh也不影响运行,nohup捕获了sighup信号,并做了忽略处理,因此断开终端不会关闭进程,但使用ctrl+c可以关闭该进程,所以一般用nohup+&结合使用。

例:nohup command

3)结合使用

方法1

nohup command &>> log.out &

方法2

su - root -c "command &>> log.out &"

4)运行后补救措施

当我们已经在前台开启了一个任务,想让其在后台运行,但又不想中断后重新开启该怎么办呢?

①将作业挂起

ctrl+z

②查看作业号

jobs

③将挂起的作业在后台运行

bg jobid

如果想继续放在前台运行:fg jobid

2、screen

用于命令行终端切换


a、会话恢复

只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,

用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。

同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)


b、多窗口

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,

并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,

可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。 会话共享 Screen可以让一个或多个用户

从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,

可以对窗口进行密码保护。


c、screen的安装

yum install -y screen


基本语法

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


选项

-A  将所有的视窗都调整为目前终端机的大小。

-d <作业名称>  将指定的screen作业离线。

-h <行数>  指定视窗的缓冲区行数。

-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。

-r <作业名称>  恢复离线的screen作业。

-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。

-s  指定建立新视窗时,所要执行的shell。

-S <作业名称>  指定screen作业的名称。

-v  显示版本信息。

-x  恢复之前离线的screen作业。

-ls或--list  显示目前所有的screen作业。

-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。


常用screen参数

screen -S yourname -> 新建一个叫yourname的session

screen -ls -> 列出当前所有的session

screen -r yourname -> 回到yourname这个session

screen -d yourname -> 远程detach某个session

screen -d -r yourname -> 结束当前session并回到yourname这个session


在每个screen session 下,所有命令都以 ctrl+a(Ctrl + a) 开始。


Ctrl + a ? -> 显示所有键绑定信息

Ctrl + a c -> 创建一个新的运行shell的窗口并切换到该窗口

Ctrl + a n -> Next,切换到下一个 window 

Ctrl + a p -> Previous,切换到前一个 window 

Ctrl + a 0..9 -> 切换到第 0..9 个 window

Ctrl+a [Space] -> 由视窗0循序切换到视窗9

Ctrl + a Ctrl + a -> 在两个最近使用的 window 间切换 

Ctrl + a x -> 锁住当前的 window,需用用户密码解锁

Ctrl + a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 

Ctrl + a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。

Ctrl + a w -> 显示所有窗口列表

Ctrl + a t -> time,显示当前时间,和系统的 load 

Ctrl + a k -> kill window,强行关闭当前的 window

Ctrl + a -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 [vi 一样

C-b Backward,PageUp 

C-f Forward,PageDown 

H(大写) High,将光标移至左上角 

L Low,将光标移至左下角 

0 移到行首 

$ 行末 

w forward one word,以字为单位往前移 

b backward one word,以字为单位往后移 

Space 第一次按为标记区起点,第二次按为终点 

Esc 结束 copy mode 

Ctrl + a ] -> paste,把刚刚在 copy mode 选定的内容贴上


操作示例见:https://wangchujiang.com/linux-command/c/screen.html


5.screen命令

5.1 介绍

如果说上面的方法是通过linux 相关本身命令实现了前后台任务调度,那么screen就提供了另外一种思路。

不说人话的版本:GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

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

5.2 安装

yum install screen

5.3 使用

1)新建会话

screen -S yourname -> 新建一个叫yourname的session

2) 列出当前所有的session

screen -ls

3)恢复会话(回到yourname这个session)

screen -r yourname

4) detach某个session

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

5)删除会话

screen -S pid-X quit


本文地址:https://46zy.com/?id=78
版权声明:本文为原创文章,版权归 四六资源网 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

 评论列表

  1. 四六资源网
    四六资源网  @回复

    screen 的创建、恢复、删除命令如下,
    创建:screen -S name
    查看有多少会话:screen -ls
    恢复:screen -r name
    先恢复没有则创建:screen -R name
    删除:screen -S name -X quit
    指定作业离线:screen -d name
    screen -ls #查看已建的screen ID(保持只有一个xdd会话,多的话可能运行不正常,百度screen删除会话命令)
    screen -r xdd #连接已经创建的screen窗口
    screen已经是后台,不需要-d,不需要nohup
    安装完xdd-plus后,查看已建的screen ID,有的同学可能发现,存在多个screen ID
    那么我们就可以按照以下命令来删除
    输入screen -S 数字.xdd -X quit
    name为你查看到的screen ID,改成你自己的screen ID即可,然后一个个删除后,再次执行screen -ls查询命令,确定只有一个了就是正常的了。