linux命令jobs、fg、bg、kill、killall、nohup

2018-07-03 19:26:35

jobs 可以列出当前进程组后台的程序。

-l	同时列出 PID 的号码
-r	仅列出正在背景 run 的工作
-s	仅列出正在背景当中暂停(stop)的工作


下面我们编译一个C程序(main.c)来充当测试用

#include <stdio.h>
int main(){
    int i = 0;
    while(1){
        i++;
        sleep(1);
    }
}
#我们先运行一个不会终止的程序
#然后按下 ctrl+z,此时程序暂停
[root@192 tmp]# /root/c/a.out
^Z
[1]+  Stopped                 /root/c/a.out

#在运行2个程序,此时加上 &
[root@192 tmp]# /root/c/a.out &
[2] 43302

[root@192 tmp]# /root/c/a.out &
[3] 43304

执行上面指令,此时,后台已经有2个程序,一个运行,一个暂停。我们可以利用 jobs 来查看。1,2,3代表工作号码,+ 标记代表当调用fg时,默认会调到前台运行的程序,-标记代表最近被放入后台的程序。

[root@192 tmp]# jobs -l
[1]+ 43301 Stopped                 /root/c/a.out
[2]  43302 Running                 /root/c/a.out &
[3]- 43304 Running                 /root/c/a.out &
#此时,工作号为1的程序在后台开始运行
[root@192 tmp]# bg %1
[1]+ /root/c/a.out &

[root@192 tmp]# jobs -l
[1]  43301 Running                 /root/c/a.out &
[2]- 43302 Running                 /root/c/a.out &
[3]+ 43304 Running                 /root/c/a.out &

#会把工作号为1的程序拉到前台来运行
[root@192 tmp]# fg %1

#在后台重新运行工作号为1的进程
[root@192 tmp]# bg %1

此时当我们关闭连接终端时,同一进程组里的程序都会受到 SIGHUP 和 SIGCONT 信号,SIGHUP信号默认的处理动作为终止进程,SIGCONT信号时为了先让停止的进程重新开始以便 SIGHUP 能终止他。

这就是为啥我们平时利用 & 挂在后台运行的程序在我们关闭终端时就会跟着终止。

有几种方法可以让进程不终止。

1.自己开发的程序主动忽略 SIGHUP 信号。
2.利用nohup指令来运行程序。
3.利用定时器 at 来延时执行程序。

#错误输出和标准输出都会输出到nohup.out
nohup /root/c/a.out &

#如果不需要输出数据则可以这样运行
nohup /root/c/a.out > /dev/null 2>&1 &

#利用 at 来执行命令
#1分钟后运行
echo '/root/c/a.out' | at now + 1 minutes


kill 命令可以向进程或进程组发送信号

-l	列出所有信号
-s	用信号名发送信号
-u	指定用户
-n      用信号编号来发送
[root@192 tmp]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
#向所有进程(除了pid=1的进程)发送信号
kill -s SIGTERM -1

#向当前进程组的所有进程发送信号
kill -s SIGTERM 0

#向进程id为1234进程发送 SIGTERM 信号
#下面3个等同
kill 1234
kill -15 1234
kill -s SIGTERM 1234


killall 用来根据程序名来发送信号。

-i    interactive(交互)
-e    exact,表示后面接的command name要一致,但整个完整的指令不能超过 15 个字符。
-I    忽略大小写。
-bash: killall: command not found
[root@192 tmp]# yum install psmisc
killall -1 httpd
killall -SIGHUP httpd

killall httpd
killall -15 httpd
killall -SIGTERM httpd


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/7d

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。