linux命令jobs、fg、bg、kill、pkill、nohup
首页 计算机相关 linux命令 linux命令jobs、fg、bg、kill、pkill、nohup
jobs 可以列出当前进程组后台的程序。-l同时列出 PID 的号码
-r仅列出正在背景 run 的工作
-s仅列出正在背景当中暂停(stop)的工作
下面我们编译一个C程序(main.c)来充当测试用#include
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) SIGKILL10) SIGUSR1
11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM
16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP
21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ
26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR
31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3
38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8
43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13
48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12
53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7
58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2
63) SIGRTMAX-164) SIGRTMAX#向所有进程(除了pid=1的进程)发送信号
kill -s SIGTERM -1
#向当前进程组的所有进程发送信号
kill -s SIGTERM 0
#向进程id为1234进程发送 SIGTERM 信号
#下面3个等同
kill 1234
kill -15 1234
kill -s SIGTERM 1234
pkill 用来根据程序名来发送信号,具体用法参照 pkill