【问题标题】:How to know where does a signal come from on Linux?如何知道 Linux 上的信号来自哪里?
【发布时间】:2020-07-30 04:23:29
【问题描述】:

我正在运行一个 python 脚本,但它总是以某种方式停止。所以我需要知道是谁阻止了这个过程。

是否有任何工具可以知道是谁发送了停止进程的信号?

【问题讨论】:

    标签: linux process signals


    【解决方案1】:

    如果您能够在主进程结束时等待,您可以添加如下内容:

    import signal
    siginfo = signal.sigwaitinfo({signal.SIGTERM})
    print("got %d from %d by user %d\n" % (siginfo.si_signo,
                                             siginfo.si_pid,
                                             siginfo.si_uid))
    

    (改编自 here:适用于 Linux 上的 Python 3.5.2)

    这将阻止您的脚本并使其等待直到它收到一个 SIGTERM,然后它会打印出发送 SIGTERM 的进程的 pid。如果是 SIGINT 停止了您的程序,您可以将 SIGTERM 换成 SIGINT。不幸的是,您只能在主进程中捕获信号,而不能在单独的线程中捕获信号,请参阅here 了解更多信息。

    【讨论】:

    • 我试过了,但程序无法终止。我猜这不是 SIGTERM,因为停止的 python 脚本的返回值是 149。我以前从未见过 149 作为返回值。
    • 如果python脚本被信号停止,它不会必然退出并返回代码;它可能会从操作系统获得退出状态,在 linux 上总是大于 128。可能是 149 = 128 + 信号编号,请参见:unix.stackexchange.com/a/99143
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多