事情的起因是这样的:
今天在阿里云买了个服务器,开始研究python的简单web监听,使用python test.py
开启了监听,但最后随手通过了ctrl+z结束,再次启动的时候就提示:
Traceback (most recent call last):
File "test.py", line 19, in <module>
main()
File "test.py", line 11, in main
sock.bind(('172.17.28.105',8006))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
端口被占用,实际上是线程为结束。
之前在windows上使用sublime text3 + python进行python开发的时候,遇到过后台有很多python进程的情况,于是想手动杀进程,查看了一下PID=1276,:
root@iZ2ze4r3b4xczuujolp68uZ:~# ps -au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 622 0.0 0.2 15956 2304 ttyS0 Ss+ 13:53 0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,960
root 625 0.0 0.1 16180 1908 tty1 Ss+ 13:53 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root 804 0.0 0.5 22648 5248 pts/1 Ss 13:53 0:00 -bash
root 1276 0.0 0.8 35672 8172 pts/1 T 16:26 0:00 python test.py
root 1285 0.0 0.3 37368 3348 pts/1 R+ 16:27 0:00 ps -au
但是并杀不动……
root@iZ2ze4r3b4xczuujolp68uZ:~# kill -1276
-bash: kill: 1276: invalid signal specification
看网上说什么找父进程再杀,但是都不行。
这个时候,这个任务的状态STAT就令我感兴趣了,为什么其他都不是T?
看下了下关于linux进程状态的资料(转) Linux进程状态(ps stat)之R、S、D、T、Z、X
STAT | Linux进程状态 | 解释 |
---|---|---|
R (TASK_RUNNING) | 可执行状态 | 任务正在运行或者准备就绪 |
S (TASK_INTERRUPTIBLE) | 可中断的睡眠状态 | 处于等待队伍中,等待资源有效时唤醒,如等待键盘输入、socket连接、信号等等,但可以被中断唤醒. |
D (TASK_UNINTERRUPTIBLE) | 不可中断的睡眠状态 | 处于等待队伍中,等待资源有效时唤醒,如等待键盘输入、socket连接、信号等等,但不可以被中断唤醒 |
T (TASK_STOPPED or TASK_TRACED) | 暂停状态或跟踪状态 | 进程被外部程序暂停(如收到SIGSTOP信号,进程会进入到TASK_STOPPED状态),当再次允许时继续执行(进程收到SIGCONT信号,进入TASK_RUNNING状态),因此处于这一状态的进程可以被唤醒 |
Z (TASK_DEAD – EXIT_ZOMBIE) | 退出状态 | 进程成为僵尸进程,程资源用户空间被释放,但内核中的进程PCB并没有释放,等待父进程回收 |
X (TASK_DEAD – EXIT_DEAD) | 退出状态 | 进程即将被销毁 |
这个T就是被暂停的意思。
实际上通过博客Linux命令中Ctrl+z、Ctrl+c和Ctrl+d的区别和使用可以知道:
Ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.
快捷键 | 功能说明 |
---|---|
Ctrl+c | 强制中断程序的执行 |
Ctrl+z | 任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态 |
所以此时进程是被我们暂停到后台了,那么后台进程该怎么继续操作呢?
博文fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令介绍:
指令 | 功能 | 说明 |
---|---|---|
jobs | 查看当前有多少在后台运行的命令。 | jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。 |
fg | 将后台中的命令调至前台继续运行。 | 如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。 |
bg | 将一个在后台暂停的命令,变成在后台继续执行。 | 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。 |
可以使用fg恢复被ctrl-Z暂停的进程。