gpt4 book ai didi

linux - 终止整个 bash 脚本而不是子进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:19 25 4
gpt4 key购买 nike

我有一个运行多个 rsync 命令的脚本。当我执行 ctrl+c 时,只有正在运行的 rsync 命令停止,然后脚本中的下一个命令开始。

我怎样才能更改脚本以便 ctrl+c 停止整个过程而不是只停止一个命令?

现在脚本中没有逻辑,只是一个接一个地同步不同的文件夹。

为了举例,我们假设它是

#!/bin/bash
rsync -artv foo/ bar/
rsync -artv another/ folder/

最佳答案

不幸的是,它有点丑。为了确保 bash 在您按下 ctrl-c 时获得 SIGINT,您不能让 rsync 在前台运行。相反,您需要执行以下操作:

#!/bin/bash

trap 'kill $!; exit 1;' INT
rsync -artv foo/ bar/ &
wait
rsync -artv another/ folder/ &
wait

但这并不能完全满足您的要求,因为这会将 SIGTERM 而不是 SIGINT 发送到 rsync。不幸的是,因为 rsync 是异步运行的(即在后台运行),bash 在启动它时会忽略 SIGINT,因此您不能依赖转发 SIGINT。 (rsync 很可能会重置其信号处理以接受 SIGINT,但通常使用此技术时,您应该假设正在运行的作业忽略了 SIGINT。)

主要问题是,如果 rsync 在前台运行,那么 bash 看不到 SIGINT,除非您碰巧在一个 rsync 完成后下一个 rsync 开始之前发送它。通过在后台运行作业,bash 将看到信号。

请注意,这一点都不稳健;这是在 *nix 中处理信号的乐趣之一。

关于linux - 终止整个 bash 脚本而不是子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com