【问题标题】:Linux - how does the kill -k switch work in timeout commandLinux - kill -k 开关如何在 timeout 命令中工作
【发布时间】:2015-04-29 07:25:14
【问题描述】:

我有两个单衬:

首先。我预计 5 秒后会杀死 sh -c "..." 命令,但它会一直存在到超时退出(10 秒)

timeout -k 5s 10s sh -c 'sleep 20s && echo "Long running command which is visible under: ps -elf | grep sleep during whole life (10s) time of timeout command"'

第二。我预计超时将退出并返回代码 124(因为 sh -c "..." 命令仍在运行)而命令 sh -c "..." 将继续运行(因为未设置超时的终止选项)

timeout 10s sh -c 'sleep 20s && echo "Long running command which is visible under: ps -elf | grep sleep during whole life (10s) time of timeout command"'

似乎传递给 timeout 的参数运行的时间与 timeout 命令本身一样(它不会提前终止,也不会在超时后存活)那么 kill 选项的目的是什么?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    -k 选项是如果在超时后无法终止进程,则在指定秒后发送KILL 信号。

    timeout 首先发送TERM 信号。如果指定了-k,那么它也会发送KILL 信号,跟随真正的超时值。

    例如

    timeout -k 5 10 someCommand
    

    timeout 在 10 秒后发送 TERM 信号。如果someCommand 没有响应TERM(例如,它可以阻止TERM 信号)然后timeout 发送KILL 信号 5 秒后(即在第 15 秒后开始执行)。无法屏蔽信号KILL

    【讨论】:

    • 所以我的一个衬垫的全部问题是它们在 TERM 信号之后没有终止?通过超时启动的进程也可以在超时后存活吗?
    • 您的 oneliner 将在 10 秒后终止(我没有看到任何会阻止 TERM 的内容)。那是您指定的超时时间。是的,可能。例如如果TERM 被阻止,那么进程将继续存在。
    • Hello Blue Moon,我尝试了以下命令 time timeout -k 5 10 sh -c 'sleep 20s && sighand () { true; }; trap sighand TERM; echo "RUNNING COMMAND"',它忽略了 TERM 信号,但命令运行 10 秒而不是 15 秒
    • 似乎 sigtrap 的参数必须是独立脚本才能测试我上面的示例。
    • -k 5 10 我认为这意味着它会在 5 秒后尝试杀死它并在强制杀死它之前再等待 10 秒,但从上面的答案中我了解到情况正好相反。是哪一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2012-01-05
    相关资源
    最近更新 更多