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

bash – 在失败时杀死管道中的下一个命令

发布时间:2020-12-16 01:10:34 所属栏目:安全 来源:网络整理
导读:我有一个流式备份脚本,我正在运行如下: ./backup_script.sh | aws s3 cp - s3://bucket/path/to/backup aws命令以原子方式将stdin流式传输到云存储.如果在没有EOF的情况下中断进程,则上载将中止. 我希望如果./backup_script.sh以非零退出代码退出,则会终止a
我有一个流式备份脚本,我正在运行如下:
./backup_script.sh | aws s3 cp - s3://bucket/path/to/backup

aws命令以原子方式将stdin流式传输到云存储.如果在没有EOF的情况下中断进程,则上载将中止.

我希望如果./backup_script.sh以非零退出代码退出,则会终止aws进程.

这样做的任何bash技巧?

编辑:
您可以使用以下脚本测试解决方案:

#!/usr/bin/env python
import signal
import sys
import functools

def signal_handler(signame,signum,frame):
    print "Got {}".format(signame)
    sys.exit(0)

signal.signal(signal.SIGTERM,functools.partial(signal_handler,'TERM'))
signal.signal(signal.SIGINT,'INT'))

for i in sys.stdin:
    pass

print "Got EOF"

例:

$grep --bla | ./sigoreof.py
grep: unrecognized option `--bla'
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]
Got EOF

我希望./sigoreof.py以信号终止.

使用进程替换而不是命名管道的简短脚本将是:
#!/bin/bash

exec 4> >( ./second-process.sh )
./first-process.sh >&4  &
if ! wait $! ; then echo "error in first process" >&2; kill 0; wait; fi

它与fifo非常相似,基本上使用fd作为IPC的信息载体而不是文件名.

两句话:我不确定是否有必要关闭fd 4;我假设在脚本退出时,shell会关闭所有打开的文件.

而且我无法弄清楚如何在进程替换中获取进程的PID(任何人?至少在我的cygwin上通常的$!没有用.)因此我使用了杀死组中的所有进程,这可能是不可取(但我不完全确定语义).

(编辑:李大同)

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

    推荐文章
      热点阅读