【问题标题】:Linux: How to kill SleepLinux:如何杀死睡眠
【发布时间】:2015-11-09 13:49:05
【问题描述】:

更多的是一个概念问题。如果我编写一个 bash 脚本来执行类似的操作

control_c()
{
echo goodbye
exit #$
}

trap control_c SIGINT

while true
do
sleep 10 #user wants to kill process here.
done

在 sleep 10 运行时,control+c 不会退出。是因为 linux sleep 忽略了 SIGINT 吗?有没有办法规避这种情况并让用户能够 cntrl+c 摆脱睡眠?

【问题讨论】:

标签: linux bash sleep


【解决方案1】:

您所描述的与仅发送到您的 bash 脚本的中断信号一致,而不是进程组。您的脚本收到信号,但sleep 没有,因此您的陷阱在sleep 完成之前无法执行。标准技巧是在后台运行sleep 并在其上运行wait,以便wait 接收中断信号。然后,您还应该将SIGINT 显式发送给仍在运行的任何子进程,以确保它们退出。

control_c()
{
echo goodbye
kill -SIGINT $(jobs -p)
exit #$
}

trap control_c SIGINT

while true
do
sleep 10 &
wait
done

【讨论】:

  • ctrl-d or ctrl-c (prints ^C) 没有影响正常吗?
【解决方案2】:

在 sleep 10 运行时,control+c 不会退出。

那不是真的。 control+c 退出,即使 sleep 正在运行。

您确定您的脚本是在 bash 中执行的吗?您应该在第一行明确添加“#!/bin/bash”。

【讨论】:

  • 当我在我的系统上运行脚本时(在添加#!/bin/bash 之后),在sleep 10 完成之前键入Ctrl-C 会导致脚本在打印goodbye 后终止。
【解决方案3】:

由于 sleep 不是 bash 功能而是外部应用程序,我猜 Ctrl+C 被 sleep 进程捕获,通常应该终止它。
因此,要在睡眠时执行 contorl_c 函数,用户必须按 Ctrl+C 两次:第一次 - 退出睡眠,第二次被 bash 陷阱捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 2022-01-25
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2016-03-30
    • 2016-08-20
    相关资源
    最近更新 更多