侧边栏壁纸
  • 累计撰写 119 篇文章
  • 累计创建 25 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Linux系统后台运行任务的几种方法

梁来福
2022-07-23 / 0 评论 / 0 点赞 / 2 阅读 / 5856 字
温馨提示:
本文最后更新于 2024-05-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、前言

工作的时候使用终端操作,往往会因为网络、关闭屏幕、执行CTRL+C等等原因造成ssh断开,使得正在运行的程序退出。

2、原因

主要原因在于上述的相关操作,shell默认会发送中断信号给该终端session关联的进程,从而导致进程跟随终端退出

3、分析

了解两种中断信号:

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

2、sighup: signal hang up,关闭终端,网络断线,关闭屏幕会发送此挂断信号

4、解决方案

下面我们来介绍几种后台运行的方式:

5、& 符号

把 & 符号放在执行命令的最后,使启动的程序忽略sigint信号。此时执行ctrl+c就不会关闭此进程,但是如果屏幕关闭、断网的话仍然会造成进程退出。

5.1示例

sh test.sh &

6、nohup指令

nohup(no hang up),意思就是不挂断运行。

用nohup运行命令可以使命令永久执行下去,和用户终端没有关系,断开SSH也不影响运行。

nohup捕获了SIGHUP,并做了忽略处理,因此当屏幕关闭,断网等造成ssh中断时进程不会退出。但是ctrl+c可以关闭该进程。

因此大多数情况下我们同时使用nohup和&符号来启动程序,ctrl+c和关闭终端都无法关闭。在缺省情况下所有输出都被重定向到一个名为nohup.out的文件中,此文件可以指定。

6.1基本格式

nohup Command \[ Arg ... \] \[ & \]

6.2语法

nohup (选项) (参数)

选项:
--help:在线帮助
--version:显示版本信息

参数:
程序及选项:要运行的程序及选项

6.3实例

nohup test.sh > laifu.file 2>&1 &

相关数字含义:
0:stdin (standard input)
1:stdout (standard output)
所以,nohup command > laifu.log 等价于 nohup command 1> laifu.log,这是缺省行为
2:stderr (standard error)

在上例中,输出被重定向到laifu.file文件中

7、ctrl + z、jobs、fg、bg

如果我们程序在启动的时候并没有使用&,nohup怎么办呢?

难道我们需要先执行ctrl + c将前台执行的进程终止再重新启动吗?显然很不科学。

7.1 ctrl + z

将一个前台执行的作业进程放到后台并且暂停,用术语讲就是挂起。执行后如下:

[1]+ Stopped ./test.sh

7.2 jobs

查看当前有多少在后台运行的命令,[jobnumber] 就是作业号

jobs  
[1]+ Stopped ./test.sh   
[2]+ Running ./test2.sh &
[3]+ Running ./test3.sh &
[4]+ Running ./test4.sh &
[5]+ Running ./test5.sh &
[6]+ Running ./test6.sh &

7.3 bg

将后台中暂停(挂起)的作业进程继续运行,例如把1号作业(./test.sh) 后台运行

执行完注意看已经带了&

bg 1  

[1]+ ./test.sh  &

7.4 fg

将后台中的作业调至前台继续运行,例如把2号作业(./test2.sh &)调至前台运行

fg 2   

./test2.sh

8、screen命令

8.1 介绍

8.1.1 官方介绍

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

8.1.2 人话介绍

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

8.2安装

yum install screen -y

8.3使用

8.3.1 新建会话

新建一个叫laifu的session

screen -S laifu

8.3.2 列出当前所有的session

# screen -ls

There is a screen on:
        28046.laifu     (Attached)
1 Socket in /var/run/screen/S-root.

8.3.3 恢复会话

回到laifu这个session

screen -r laifu

8.3.4 detach某个session

# 远程detach某个session
screen -d laifu

# 结束当前session并回到laifu这个session
screen -d -r laifu

8.3.5 删除会话

# screen -XS "会话id或者名称" quit

screen -XS laifu quit

8.4 参数选项

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

8.5 常用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

8.6 补充

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

C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window 
C-a p -> Previous,切换到前一个 window 
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换 
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。 
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> time,显示当前时间,和系统的 load 
C-a k -> kill window,强行关闭当前的 window
C-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 
C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
博主关闭了所有页面的评论