Tôi có một kịch bản trực tuyến sao lưu mà tôi đang chạy như sau:Kill lệnh tiếp theo trong đường ống trên thất bại (Bash)
./backup_script.sh | aws s3 cp - s3://bucket/path/to/backup
Các aws
lệnh suối stdin để lưu trữ đám mây một cách nguyên tử. Nếu quá trình bị gián đoạn mà không có EOF, quá trình tải lên sẽ bị hủy.
Tôi muốn quy trình aws
bị hủy nếu ./backup_script.sh
thoát với mã thoát khác 0.
Bất kỳ mẹo bash nào để thực hiện việc này?
EDIT: Bạn có thể kiểm tra giải pháp của bạn với kịch bản này:
#!/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, functools.partial(signal_handler, 'INT'))
for i in sys.stdin:
pass
print "Got EOF"
Ví dụ:
$ 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
Tôi muốn ./sigoreof.py
để được chấm dứt với một tín hiệu.
Tôi giả định rằng vấn đề của bạn là một sự thất bại của backup_script.sh chỉ đóng các đường ống như xa như quá trình nhận 'aws' là có liên quan; aws không thể phát hiện lỗi và giả định bản sao lưu đã ổn. –
Bên cạnh: 'sigoreof' không thực sự báo cáo tín hiệu cho tôi, mặc dù nó chắc chắn có thể phân biệt được với trường hợp EOF. './ftest: dòng 11: 53793 Chấm dứt: 15 ./sigoreof < aws.fifo 3> & -' –
Như được chỉ ra bởi @tourism: Có khả năng dupe của http://stackoverflow.com/questions/6565694/left-side-failure-on- pipe-in-bash (nhưng câu trả lời không thực sự giải quyết câu hỏi được hỏi). –