比如:
$ (sleep 1h &)
这时sleep已经在后台运行,可是发INT给它杀不掉,这怎么破?
1
lu18887 2014-08-26 09:47:03 +08:00
kill -9 不行?
|
2
love OP @lu18887
python写的程序在收到INT信号是会转成KeyboardInterrupt异常,这样退出比较好,可以做些清理,你kill -9就直接死掉了。 |
3
palxex 2014-08-26 11:44:13 +08:00
sleep(1)本身不处理SIGINT,你发给它当然没用了。写个python脚本自己实验一下就知道了,完全可以按你的预期工作。
|
4
tonyluj 2014-08-26 12:27:49 +08:00
1. SIGINT 可以被忽略,只有SIGKILL和SIGSTOP不能被忽略
2. 这与job control有关,你在shell下压入后台,后台进程组的默认handler是IGNORE |
5
love OP |
6
love OP 我说的是这样:
```bash [~]$ sleep 1h & # 在本地shell后台运行 [1] 5121 [~]$ kill -INT 5121 # kill成功 [1]+ Interrupt sleep 1h [~]$ (sleep 1h &) # 在subshell后台运行,然后subshell自动退出 [~]$ ps PID TTY TIME CMD 2623 pts/3 00:00:00 bash 5125 pts/3 00:00:00 sleep 5126 pts/3 00:00:00 ps [~]$ kill -INT 5125 # 无效了! [~]$ ps PID TTY TIME CMD 2623 pts/3 00:00:00 bash 5125 pts/3 00:00:00 sleep 5127 pts/3 00:00:00 ps [~]$ ``` |
7
love OP 发现了一个方法绕过这个问题,只要在程序中捕获SIGTERM然后调用_thread.interrupt_main()就能转成KeyboardInterrupt异常了。
|