按下“取消”时,bash zenity对话框不会终止进程
我有一个简单的bash脚本来控制amazonaws的上传和下载。上传和下载工作正常。但有时,我的互联网连接很差,我想取消AWS活动。但是,当我单击“取消”按钮(zenity进度对话框)时,AWS进程将持续不断(持续几分钟)。。。我可以终止AWS进程的唯一方法是转到终端并执行“killall-9AWS”按下“取消”时,bash zenity对话框不会终止进程,bash,amazon-s3,zenity,Bash,Amazon S3,Zenity,我有一个简单的bash脚本来控制amazonaws的上传和下载。上传和下载工作正常。但有时,我的互联网连接很差,我想取消AWS活动。但是,当我单击“取消”按钮(zenity进度对话框)时,AWS进程将持续不断(持续几分钟)。。。我可以终止AWS进程的唯一方法是转到终端并执行“killall-9AWS” while[“$repeat”-等式0];做 ... 设置代码。。。 aws s3同步“$dir1”“$dir2”--区域us-east-1--输出文本--sse--删除| tr'\r'\n'
while[“$repeat”-等式0];做
... 设置代码。。。
aws s3同步“$dir1”“$dir2”--区域us-east-1--输出文本--sse--删除| tr'\r'\n'>“$last_log_文件”
... 错误代码分析
已完成| zenity--progress--title=“$title_text”--text=“$msg”--pulsate--自动关闭
killall-9 aws#多亏了Eric的回答,我现在有了一个解决方案。关键是在zenity命令末尾添加“&”,以便运行并行进程
done | zenity --progress --title="$title_text" --text="$msg" --pulsate --auto-close &
然后添加一些代码来检测zenity pid是否消失(因为它被取消)。一旦检测到zenity pid消失,killall命令将用于终止aws
一些示例代码:
zenity_pid="$(pidof zenity)"
while [ "$zenity_pid" != '' ]; do
echo "$(pidof zenity)" | grep -w "$zenity_pid"
if [ "$?" -eq 0 ]; then
sleep 2
else
killall -9 aws
zenity_pid=''
fi
done
wait
AWS返回一个退出代码137,这意味着容器接收到一个SIGKILL信号问题是AWS
和while
循环中的所有其他内容在尝试写入stdout之前不知道zenity
已关闭。一旦他们这样做,他们就会得到一个信号管,很可能存在。。正如您在我的代码中所看到的,我正在日志文件中捕获AWS输出。在传输每个文件(数百个文件)时,数据每隔部分秒定期更新一次。因此,我预计AWS在收到SIGPIPE后不到一秒钟就会关闭。我遗漏了什么吗?因为您正在写入文件而不是标准文件,所以您将无法获得SIGPIPE。只有当您尝试写入管道时,您才会得到,例如,stdoutSo,我正在寻找解决方案。正如您所看到的,AWS命令正在向标准输出写入“tr”命令。这还不够吗?如果没有,还有其他方法可以达到预期的效果。。。可能是tee或其他东西?以“$last\u log\u file”
结尾的事实阻止该行上的任何内容写入标准输出。如果您不介意混乱,您可以使用|tee“$last\u log\u file”
强制它写入标准输出,这样它将同时进入文件和管道,然后您将得到SIGPIPE错误并中断,但可能只有在它完成aws
命令后(或在输出缓冲区填满时)
zenity_pid="$(pidof zenity)"
while [ "$zenity_pid" != '' ]; do
echo "$(pidof zenity)" | grep -w "$zenity_pid"
if [ "$?" -eq 0 ]; then
sleep 2
else
killall -9 aws
zenity_pid=''
fi
done
wait