当进程正在写入文件时,“kill -INT pid”和“kill pid”之间的区别
Posted
技术标签:
【中文标题】当进程正在写入文件时,“kill -INT pid”和“kill pid”之间的区别【英文标题】:difference between 'kill -INT pid' and 'kill pid' when process is in the middle of writing to a file 【发布时间】:2021-04-28 22:16:40 【问题描述】:我在指定时间运行 python 脚本并在另一个指定时间停止它。这两项任务都是使用 cron 完成的。
python 脚本的工作是将一段文本写入文本文件(比如每 5 秒)。在某个时间,将发生第二个 cron 作业,这将停止运行 python 脚本。我的目标是在第二个 cron 作业停止正在运行的 python 程序后(在指定时间),在文本文件中查看 python 脚本的输出。
一开始我尝试了以下命令:kill $(pgrep -f cron_test.py)
但是,我发现每当我在结束 python 脚本时查看文本文件的内容时,什么都不会写入。
然后我尝试了以下命令作为替代:kill -INT $(pgrep -f cron_test.py)
这个命令似乎可以让我停止运行 python 程序,同时写入文件。
我不明白为什么替换命令允许我写入文件,而我尝试的初始命令不允许。任何帮助表示赞赏。
【问题讨论】:
kill -INT pid
发送一个 SIGINT 信号,另一方面,kill pid
发送一个 SIGTERM。
【参考方案1】:
kill
向进程发送信号。最常见的信号是:
Signal x86/ARM Alpha/ MIPS PARISC Notes
most others SPARC
─────────────────────────────────────────────────────────────────
SIGHUP 1 1 1 1
SIGINT 2 2 2 2
SIGQUIT 3 3 3 3
SIGILL 4 4 4 4
SIGTRAP 5 5 5 5
SIGABRT 6 6 6 6
SIGIOT 6 6 6 6
SIGBUS 7 10 10 10
SIGEMT - 7 7 -
SIGFPE 8 8 8 8
SIGKILL 9 9 9 9
SIGUSR1 10 30 16 16
SIGSEGV 11 11 11 11
SIGUSR2 12 31 17 17
SIGPIPE 13 13 13 13
SIGALRM 14 14 14 14
SIGTERM 15 15 15 15
默认是SIGTERM,所以kill $(pgrep -f cron_test.py)
和kill -15 $(pgrep -f cron_test.py)
一样
脚本(或与此相关的任何程序)可以选择捕获信号。 Python 中的示例脚本:
import signal
import os
import time
def receiveSignal(signalNumber, frame):
print('Received:', signalNumber)
print ("Oh dear, someone just signaled me")
return
if __name__ == '__main__':
# register the signals to be caught
signal.signal(signal.SIGINT, receiveSignal)
print('My PID is:', os.getpid())
while True:
print('Waiting...')
time.sleep(3)
因此,您的脚本很可能有一个针对 SIGINT 的特定处理程序,它会优雅地关闭程序、写入输出等。
【讨论】:
以上是关于当进程正在写入文件时,“kill -INT pid”和“kill pid”之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 FileLock、Python 写入文件时权限被拒绝