我一直以来有一个误解,那就是在终端运行某个程序时,按下Ctrl + D时我误以为就是杀死了这个进程,今天才知道原来不是。比如我利用libevent在Linux环境下写了一个网络监听程序,当启动程序之后,就会一直监听本地的6789端口。如果此时按下Ctrl + D,其实这个进程不是结束了,而是暂停并转为后台运行了(Ctrl + C才是终止进程)。当再次启动程序的时,就是因为端口被占用而出现“bind error”,请看:
[xiaoku@localhost workspace]$ ls echoServer main.cpp tags [xiaoku@localhost workspace]$ ./echoServer Listening... ^Z [1]+ 已停止 ./echoServer [xiaoku@localhost workspace]$ ./echoServer bind error [xiaoku@localhost workspace]
此时利用jobs可以查看后台状态,并利用fg命令将任务转为前台运行:
[xiaoku@localhost workspace]$ jobs [1]+ 已停止 ./echoServer [xiaoku@localhost workspace]$ fg 1 ./echoServer
利用bg命令可以将后台停止的任务转为后台运行:
[xiaoku@localhost workspace]$ jobs [1]+ 已停止 ./echoServer [xiaoku@localhost workspace]$ bg [1]+ ./echoServer & [xiaoku@localhost workspace]$ jobs [1]+ 运行中 ./echoServer & [xiaoku@localhost workspace]$
所以总结起来有以下几点:
(1)Ctrl + z 停止进程并放入后台运行
(2) jobs 显示当前后台运行的进程
(3) bg %N 使第N个任务在后台运行(%前有空格),如果不带%N则表示对最后一个进程操作
(4) fg %N 使第N个任务在前台运行(%前有空格),如果不带%N则表示对最后一个进程操作
(5)Ctrl + c 终止进程!
如果我想停止这个进程怎么办呢?最简单的办法就是先调用fg将任务切换到前台运行,然后按Ctrl + c。不过也可以用暴力手段,下面介绍一下如何查看端口状态和(通过端口号)找到相关进程号,并强行杀死进程:
[xiaoku@localhost workspace]$ netstat -tln | grep 6789 <使用netstat查看端口状态> tcp 0 0 0.0.0.0:6789 0.0.0.0:* LISTEN [xiaoku@localhost workspace]$ lsof -i:6789 <这里使用lsof查看指定的端口号6789所对应的进程名称、ID等信息> COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME echoServe 2796 xiaoku 3u IPv4 1268175 0t0 TCP *:smc-https (LISTEN) [xiaoku@localhost workspace]$ kill -9 2796 <强行杀死进程> [1]+ 已杀死 ./echoServer [xiaoku@localhost workspace]$ ./echoServer & <直接后台运行进程> [1] 2909 Listening... [xiaoku@localhost workspace]$ jobs [1]+ 运行中 ./echoServer & [xiaoku@localhost workspace]$