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

前端之家收集整理的这篇文章主要介绍了bash – 在失败时杀死管道中的下一个命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个流式备份脚本,我正在运行如下:
./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上通常的$!没有用.)因此我使用了杀死组中的所有进程,这可能是不可取(但我不完全确定语义).

猜你在找的Bash相关文章