1. kill命令—{kill,killall,pkill}
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开、头(可省略),不区分大小写
显示当前系统可用信号: kill –l 或者 trap -l
1.1. 常用信号:man 7 signal
(1) SIGHUP 无须关闭进程而让其重读配置文件
(2) SIGINT 中止正在运行的进程;
相当于Ctrl+c
例如kill -2 `pidof ping`
(3) SIGQUIT 相当于ctrl+\
有些命令用它退出,可用 kill -QUIT
比如bc命令, `pidof bc`或者 kill -3
(9) SIGKILL 强制杀死正在运行的进程:强制退出
(15) SIGTERM 终止正在运行的进程:正常退出
(18) SIGCONT 继续运行
(19) SIGSTOP 后台休眠
1.2. 指定信号的方法
- 信号的数字标识:1, 2, 9
- 信号完整名称:SIGHUP
- 信号的简写名称:HUP
1.2.1. 举例:kill -1
cd /var/www/html
echo welcome to my web >index.html
curl 192.168.20.100
vim /etc/httpd/conf/httpd.conf :其中的页面文件位置修改为newhtml
mkdir newhtml
cd newhtml
vim index.html :重新写一个新的页面文件
ps auxf 或者 ps -ef 或者 pidof httpd|apache 或者 pstree -p
kill -1 apache的父进程pid(由root启动的那个pid)
kill -n 1 pid :注意一个带-一个不带-
1.2.2. 举例:kill -15 (默认)
ps aux |grep mingetty
kill mingettypid :此命令执行后发现pid号虽然没了,但是会生成一个新的pid号把它重新挂起
pstree -p :查看是哪一个父进程拉起mingetty,发现是1进程
kill 1 :杀不死1进程,但是此时再次执行 kill pidmingetty 发现它无法再自动起来了,说明此命令对于1进程还是有影响的
因此不要随便用kill杀进程,比如杀掉sshd服务,则远程将无法再次连接,必须在硬件主机上面重启sshd :systemctl start sshd 才可以再次使用,这将有可能出现严重问题
1.3. 按PID方式:
kill [-SIGNAL] pid …
kill –n SIGNAL pid
kill –s SIGNAL pid
1.4. 按名称:
killall [-SIGNAL] comm… :它可以一次性杀掉对应名字进程包含的所有pid ,而kill 一次只能杀掉一个
1.5. 按模式—{pkill}:
pkill [options] pattern (正则表达式)
1.5.1. pkill选项:
-SIGNAL :
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名(pgrep可用)
-a: 显示完整格式的进程名(pgrep可用)
-P pid: 显示指定进程的子进程
1.5.2. 举例:
pkill -9 -t pts/1 :把终端上全部进程杀掉包括bash shell
pkill pin.* :正则表达式模式法杀掉ping(或者pin开头的任意进程))
2. killall -0 cmdname 的用法
此命令不进行进程管理,但是会检查cmd名进程是否正常运行,类似于pidof ,把返回值存入$?中,用于判断cmd进程是否正常运行。
3. 任务作业管理
3.1. Linux的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,但启动后即转入后台运行
- Centos7关闭终端后后台作业同样也会关闭,不过Centos6上并非如此,Centos6上的后台命令看起来就像默认加上了nohup一样
- 守护进程:和终端无关,后台运行
3.2. 让作业运行于后台(注意不是守护运行)
运行中的作业:
Ctrl+z,它会放入后端但是让它处于stop休眠状态尚未启动的作业:
COMMAND &- 注意:后台作业虽然被送往后台运行,但其依然与终端相关;退出当前终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系,有以下两种方式:
- nohup COMMAND &> /dev/null &
- screen;COMMAND
3.3. 查看当前终端所有作业—{jobs}
3.4. 作业控制:
fg [[%]JOB_NUM]:把指定的后台作业调回前台
bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
kill [%JOB_NUM]: 给后台命令发信号
- 利用 '%jobs编号' 的方式,无需查找后台运行命令的PID了,更加方便;
- 当然也可以用jobs -l查看后台运行的命令PID,然后用kill PID
3.5. 易混淆点:
killall -18手动开启休眠状态的进程 ,killall -19手动停止正在运行的进程。这两个命令和前端,后端没有任何关系,和终端也没有关系,只要能找到进程,就可用它操作(也可用pstree -p或则pidof或者ps aux找到进程编号然后kill -18 -19也可)进程和终端相关是因为它是在终端内开了个子shell来运行的,只要终端关闭(比如远程sshd服务终端关闭),父进程都关闭了那么它下面的无论是前端还是后端任务都将会关闭,例如关闭终端相当于关闭6681进程,则ping命令当然会关闭,无论前端后端。
├─sshd(6994)─┬─sshd(6681)───bash(6683)───ping(6773) │ └─sshd(129671)───bash(129673)───pstree(6808)
- 上面都是centos7中的逻辑,但是centos6中,如果终端关闭,则它下面的子进程会自动挂载到init上继续运行,注意区分。
- 因此用
nohup将命令运行之后,当终端关闭它会挂载到systemd上继续运行。或者还可用screen程序,则终端掉了也不会影响命令的执行。 - 注意,
command &和ctrl z的区别,- ctrl z:命令已经前台运行,将其调到后端不运行
command &:command命令没有运行,让其调到后端运行。
- 注意
fg会把后端的进城调回到前端并运行,不管它在后端否运行还是不运行。同样的bg也是让进程调回到后端进行运行,只不过因为进程前段运行的时候无法操作,同时也没有jobs编号,所以已经运行进程要用ctrl+z调到后端停止运行,然后再用bg启动运行。
3.6. nohup—{nohup}
nohup会有各种输出信息,会默认存放到文件中,类似于计划任务,要将它重定向到垃圾箱。
或者先重定向到自己的一个文件中,然后用脚本删除多少天以前的log日志。
再或者直接重定向到系统自己控制的log缓存文件夹中,它会自动清除。不过需要注意不能反复重定向一个文件,不然它一直在修改此文件的mtime,根据规则就不会自动清除它了。
Usage: nohup COMMAND [ARG]...
or: nohup OPTION
Run COMMAND, ignoring hangup signals.
--help display this help and exit
--version output version information and exit
If standard input is a terminal, redirect it from /dev/null.
If standard output is a terminal, append output to 'nohup.out' if possible,
'$HOME/nohup.out' otherwise.
If standard error is a terminal, redirect it to standard output.
To save output to FILE, use 'nohup COMMAND > FILE'.
3.7. 并行运行
同时运行多个进程,提高效率(相当于同时启动多个后台程序)
- 方法1,利用脚本运行(子shell)vi all.sh f1.sh & f2.sh & f3.sh &
- 然后运行此脚本
- 方法2 ,开启子shell命令环境运行
(f1.sh &);(f2.sh &);(f3.sh &) - 方法3:注意中括号边上有空格 ,在当前shell环境下运行
{ f1.sh & f2.sh & f3.sh & }
留言