程序运行可以有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
进行终止。如果想根据进程名终止所有相关进程,还能使用pkill
或killall
命令,如pkill 进程
名或killall 进程名
。