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

bash – 即使第一个命令的子进程仍在后台运行,也要关闭管道

发布时间:2020-12-15 21:08:32 所属栏目:安全 来源:网络整理
导读:假设我有test.sh如下.目的是通过此脚本运行一些后台任务,不断更新某些文件.如果后台任务由于某种原因而终止,则应该再次启动它. #!/bin/shif [ -f pidfile ] kill -0 $(cat pidfile); then cat somewhere exitfiwhile true; do echo "something" somewhere sl
假设我有test.sh如下.目的是通过此脚本运行一些后台任务,不断更新某些文件.如果后台任务由于某种原因而终止,则应该再次启动它.

#!/bin/sh

if [ -f pidfile ] && kill -0 $(cat pidfile); then
    cat somewhere
    exit
fi

while true; do
    echo "something" >> somewhere
    sleep 1
done &
echo $! > pidfile

并想把它称为./test.sh |其他程序,例如G. ./test.sh |猫.

管道未关闭,因为后台进程仍然存在并可能产生一些输出.如何告诉管道在test.sh结束时关闭?在调用管道命令之前,有没有比检查pidfile存在更好的方法?

作为变种,我尝试使用#!/ bin / bash并在test.sh的末尾显示,但它仍在等待管道关闭.

我实际上试图实现的目标:我有一个“状态”脚本,它收集各种脚本的输出(正常运行时间,免费,日期,get-xy-from-dbus等),类似于此test.sh.脚本的输出传递给我的窗口管理器,窗口管理器显示它.它也用在我的GNU屏幕底线上.

由于使用的某些脚本可能需要一些时间来创建输出,因此我想将它们从输出集合中分离出来.所以我把它们放在一段时间了;做脚本;睡1;完成循环,如果它还没有运行则启动.

现在的问题是我不知道如何告诉调用脚本“真正”分离守护进程.

解决方法

看看这是否符合您的目的:
(我假设你对while循环中的任何stderr命令不感兴趣.如果你是的话,你会调整代码.:-))

#!/bin/bash

if [ -f pidfile ] && kill -0 $(cat pidfile); then
    cat somewhere
    exit
fi

while true; do
    echo "something" >> somewhere
    sleep 1
done >/dev/null 2>&1 &
echo $! > pidfile

(编辑:李大同)

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

    推荐文章
      热点阅读