加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在shell脚本中实现无限等待

发布时间:2020-12-15 19:15:10 所属栏目:安全 来源:网络整理
导读:这可能听起来很小,但我很确定这个问题没有被问到,或至少我找不到。 我正在寻找一种使用shell脚本来构造无限等待(不一定是循环)的方式,以便它永远等待并且可以被杀死(或者在技术上,可以接收SIGTERM)。以下是已知的可能的构造和针对他们的参数: 而真的做
这可能听起来很小,但我很确定这个问题没有被问到,或至少我找不到。

我正在寻找一种使用shell脚本来构造无限等待(不一定是循环)的方式,以便它永远等待并且可以被杀死(或者在技术上,可以接收SIGTERM)。以下是已知的可能的构造和针对他们的参数:

>而真的做睡觉1完成这几乎得到了,但是由于sleep是一个外部命令,当我发送一个SIGTERM到运行脚本时,它必须等待睡眠完成,然后处理信号。将睡眠1改为像睡眠10这样的滞后将会很明显。此外,解决方案每1秒唤醒CPU,这不是理想的。
>而真的做阅读完成当stdin是tty时,这是完美的。读是一个shell内置函数,SIGTERM立即到达脚本。但是,当stdin是/ dev / null时,脚本通过无限期地在/ dev / null上永远运行读取所有CPU。

因此,需要等待永久的shell内建结构。通过人的破折号我没有找到这样的一个 – 唯一的阻塞内置是被读取和等待,我不知道如何构建一个理想的使用等待。

答案应该适用于POSIX shell(有效地破折号),或者更不用说Bash。

补充笔记。

第一个例子不能正常工作的情况比我想象的更复杂。使用以下shell脚本:

#!/bin/sh
echo $$
while true; do
    sleep 100
done

如果你在另一个tty杀死它,它会立即终止。当你试图陷阱时,有趣的事情就开始了。用这个脚本:

#!/bin/sh
at_term() {
    echo 'Terminated.'
    exit 0
}
trap at_term TERM
echo $$
while true; do
    sleep 20
done

发生的是在示例1中完全描述的。这发生在bash,dash和zsh。在这种情况下,我正在寻求一个“完美”的无限外观构造。

您可以使用命名管道进行阅读:
mkfifo /tmp/mypipe
#or mknode /tmp/mypipe p

如果以后想要向管道发送不同的任意“信号”,则读取可以与案例语句一起使用以采取适当的操作(甚至有用的)

while read SIGNAL; do
    case "$SIGNAL" in
        *EXIT*)break;;
        *)echo "signal  $SIGNAL  is unsupported" >/dev/stderr;;
    esac
done < /tmp/mypipe

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读