Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按下“取消”时,bash zenity对话框不会终止进程_Bash_Amazon S3_Zenity - Fatal编程技术网

按下“取消”时,bash zenity对话框不会终止进程

按下“取消”时,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'

我有一个简单的bash脚本来控制amazonaws的上传和下载。上传和下载工作正常。但有时,我的互联网连接很差,我想取消AWS活动。但是,当我单击“取消”按钮(zenity进度对话框)时,AWS进程将持续不断(持续几分钟)。。。我可以终止AWS进程的唯一方法是转到终端并执行“killall-9AWS”

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