[原]对Linux环境下任务调度一点认识

时间:2023-01-15 20:04:57

  我一直以来有一个误解,那就是在终端运行某个程序时,按下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]$