当进程正在写入文件时,“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 写入文件时权限被拒绝

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

当父母和孩子都写入标准输出时,输出中没有交错

当子进程和父进程在 Perl 中写入同一个日志文件时进程卡住(在 Windows 中)