我有一个流式备份脚本,我正在运行如下:
./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上通常的$!没有用.)因此我使用了杀死组中的所有进程,这可能是不可取(但我不完全确定语义).