1. kill命令—{kill,killall,pkill}

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. 信号的数字标识:1, 2, 9
  2. 信号完整名称:SIGHUP
  3. 信号的简写名称: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. 易混淆点:

  1. killall -18 手动开启休眠状态的进程 ,killall -19 手动停止正在运行的进程。这两个命令和前端,后端没有任何关系,和终端也没有关系,只要能找到进程,就可用它操作(也可用pstree -p 或则 pidof 或者 ps aux 找到进程编号然后kill -18 -19也可)

  2. 进程和终端相关是因为它是在终端内开了个子shell来运行的,只要终端关闭(比如远程sshd服务终端关闭),父进程都关闭了那么它下面的无论是前端还是后端任务都将会关闭,例如关闭终端相当于关闭6681进程,则ping命令当然会关闭,无论前端后端。

    ├─sshd(6994)─┬─sshd(6681)───bash(6683)───ping(6773) │ └─sshd(129671)───bash(129673)───pstree(6808)
  • 上面都是centos7中的逻辑,但是centos6中,如果终端关闭,则它下面的子进程会自动挂载到init上继续运行,注意区分
  1. 因此用nohup将命令运行之后,当终端关闭它会挂载到systemd上继续运行。或者还可用screen程序,则终端掉了也不会影响命令的执行。
  2. 注意,command & ctrl z 的区别,
    • ctrl z:命令已经前台运行,将其调到后端不运行
    • command & :command命令没有运行,让其调到后端运行。
  3. 注意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. 方法1,利用脚本运行(子shell)
    vi all.sh f1.sh & f2.sh & f3.sh &
  • 然后运行此脚本
  1. 方法2 ,开启子shell命令环境运行
    (f1.sh &);(f2.sh &);(f3.sh &)
  2. 方法3:注意中括号边上有空格 ,在当前shell环境下运行
    { f1.sh & f2.sh & f3.sh & }
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。