先ping
先ping
Published on 2022-08-14 / 14 Visits
0
0

快速掌握jobs前后台运行进程

程序运行可以有2种:

  • 前台运行
    程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用
    如果终端异常关闭,导致程序会自动退出

  • 后台运行
    不会占用你的终端,程序在系统后台跑着,你该干啥干啥,终端关了,程序也继续运行。

后台运行命令

命令集合

command &    # 未启动的command放入后台去运行
jobs                # 查看后台进程列表
ctrl + z         # 暂停进程
bg                  # 程序放入后台运行,和 & 一样
fg                    # 将后台任务放入前台执行

后台命令实战(实战经验)

# 1.命令直接放入后台运行,注意日志写入到黑洞文件

[root@master10 ~]# ping www.jd.com > /dev/null &
[1] 3694
[root@master10 ~]#

# 2.查看后台任务列表

[root@master10 ~]# jobs
[1]+  Running                 ping www.jd.com > /dev/null &


# 3.可以将后台任务,放入前台执行,然后ctrl + z 再次暂停程序,放入后台
[root@master10 ~]# fg 1
ping www.jd.com > /dev/null

^Z
[1]+  Stopped                 ping www.jd.com > /dev/null
[root@master10 ~]# 
的确发现了一个停止的程序
[root@master10 ~]# jobs
[1]+  Stopped                 ping www.jd.com > /dev/null
[root@master10 ~]# 



# 4.可以再次让程序运行起来,并且依然是运行在后台
[root@master10 ~]# bg 1
[1]+ ping www.jd.com > /dev/null &
[root@master10 ~]# jobs
[1]+  Running                 ping www.jd.com > /dev/null &
[root@master10 ~]# 


nohup命令
直接使用&符号让命令在后台运行有一个风险,当前bash会话异常断开后,后台运行的命令也随之消失。
但利用 nohup结合&符号使用可以避免这一风险。


杀死后台

要停掉jobs命令看到的后台进程,可使用kill命令,具体步骤如下:

使用jobs命令查看后台进程列表,找到要停止的进程的作业号。例如,jobs -l可以列出所有任务的 PID。输出信息中,第一列是作业编号,带加号的作业被当做默认作业,带减号的为下一个默认作业。

[root@test-110 /script/for]#jobs -l
[1]    880 Stopped                 bash ping.sh
[2]-  1036 Stopped                 bash ping.sh
[3]+  1060 Stopped                 bash ping.sh

使用kill命令加上作业号来终止后台进程,格式为kill %作业号。例如,如果要终止作业号为 1 的后台进程,就执行kill %1

[root@test-110 /script/for]#jobs -l
[1]    880 Stopped                 bash ping.sh
[2]-  1036 Stopped                 bash ping.sh
[3]+  1060 Stopped                 bash ping.sh
[root@test-110 /script/for]#kill %1

[1]   Stopped                 bash ping.sh
[root@test-110 /script/for]#jobs -l
[1]    880 Terminated              bash ping.sh
[2]-  1036 Stopped                 bash ping.sh
[3]+  1060 Stopped                 bash ping.sh

如果普通的kill命令没有效果,可以尝试使用kill -9 %作业号来强制终止进程。这将发送SIGKILL信号给进程,这是一个强制终止进程的信号,进程无法忽略。

[root@test-110 /script/for]#kill -9 %2

[2]-  Stopped                 bash ping.sh
[root@test-110 /script/for]#jobs -l
[2]-  1036 Killed                  bash ping.sh
[3]+  1060 Stopped                 bash ping.sh

此外,也可通过ps命令查看作业的进程号(PID),然后执行kill PID来终止进程。例如,ps -ef | grep 进程名找到对应进程的 PID,再使用kill PID进行终止。如果想根据进程名终止所有相关进程,还能使用pkillkillall命令,如pkill 进程名或killall 进程名


Comment