【问题标题】:kill specific Process inside FIFO with zenity cancel使用 zenity cancel 杀死 FIFO 中的特定进程
【发布时间】:2019-12-06 16:52:35
【问题描述】:

我有一个进程作为 FIFO 管道的一部分运行

FIFO=$(mktemp -u)
mkfifo $FIFO
(cat $FIFO | zenity --progress \
                    --width 500 --height 25 --title="Uploading to Youtube " \
                    --text='<span font="12" font_weight="bold" foreground="red">'$xy'\n '"$fz"' Youtube Upload: '$fcount' TO GO </span>' --pulsate --auto-close --auto-kill) &
upl=$(python /home/pi/Documents/ytu/yt_up.py --file="${_file}" --title="$finaltitle $xy"  --description="$show_body" --keywords="$yt_tags" --category="28" --privacyStatus="$priv")
echo 'Bye bye' > $FIFO
rm -f $FIFO

目前这很好用,Zenity 进度在 python 脚本执行和关闭时保持打开状态。 但是我希望能够使用取消按钮中止该过程,并在上面的代码之后尝试过这个:

FIFO=$(mktemp -u)
mkfifo $FIFO
(cat $FIFO | zenity --progress \
                    --width 500 --height 25 --title="Uploading to Youtube " \
                    --text='<span font="12" font_weight="bold" foreground="red">'$xy'\n '"$fz"' Youtube Upload: '$fcount' TO GO </span>' --pulsate --auto-close --auto-kill) &
upl=$(python /home/pi/Documents/ytu/yt_up.py --file="${_file}" --title="$finaltitle $xy"  --description="$show_body" --keywords="$yt_tags" --category="28" --privacyStatus="$priv")

#updated to show code I am using
if [ "$?" = 1 ] ; then
  sudo pkill -f yt_up.py
fi
echo 'Bye bye' > $FIFO
rm -f $FIFO

但是 Zenity 进度对话框中的取消按钮似乎没有触发 pkill 事件,也没有抛出错误。我已经测试了 pkill 代码在从 CLI 运行时可以正常工作并关闭脚本

更新:我现在已经移除了 FIFO,看看是否有什么不同,也移到了 YAD,因为我可以精确定位对话窗口:

upl=$(python /home/pi/Documents/ytu/yt_up.py --file="${_file}" --title="$finaltitle $xy"  --description="$show_body" --keywords="$yt_tags" --category="28" --privacyStatus="$priv") | \
                        yad --progress \
                                --button=Cancel:1 --geometry="500x125+138+40" --width=500 --height=25 --title="Uploading to Youtube " \
                                --text='<span font="12" font_weight="bold" foreground="red">'$xy'\n '"$fz"' Youtube Upload: '$fcount' TO GO </span>' --pulsate --auto-close
                           # Cancel from zenity progress bar
                        if [ "$?" =  1 ]; then
                                sudo pkill -f yt_up.py
                                echo "Dialog output=$?"
                         fi

但是,python 进程又一次阻止了对话输出

【问题讨论】:

  • $? 永远不会是-1;它设置为 0 到 255 之间的值。
  • 好的,谢谢,只是使用其他示例中的代码,将其更改为 0,但仍然无法正常工作
  • 我相信点击取消会产生退出状态 1。
  • 谢谢,试过了,但由于某种原因无法正常工作,我的意思是 zenity 进度框关闭,而不是 python 脚本。因此,无论出于我怀疑的任何原因,都没有执行
  • 这可能与 FIFO 内部发生的 Zenity 部分有关,因此不会捕获输出吗?

标签: python bash zenity


【解决方案1】:

有两个进程在运行,主main 一个正在等待上传完成。考虑将代码组织成函数,以便更容易控制行为。

当前代码在完成时检查上传过程的状态。将始终指示成功,除非上传失败。来自zenity状态的新代码检查状态。

FIFO=$(mktemp -u)
mkfifo $FIFO
function progress {
    cat $FIFO | zenity --progress \
                --width 500 --height 25 --title="Uploading to Youtube " \
                --text='<span font="12" font_weight="bold" foreground="red">'$xy'\n '"$fz"' Youtube Upload: '$fcount' TO GO </span>' --pulsate --auto-close --auto-kill

    # Cancel from zenity progress bar
    if [ $? = 1 ] ; then
        pkill -f yt_up.py
    fi
}

progress &

upl=$(python /home/pi/Documents/ytu/yt_up.py --file="${_file}" --title="$finaltitle $xy"  --description="$show_body" --keywords="$yt_tags" --category="28" --privacyStatus="$priv")

#updated to show code I am using
echo 'Bye bye' > $FIFO
rm -f $FIFO

无法测试 - 因为未共享所需的部分。

【讨论】:

  • 感谢您的帮助,我按照建议组织了代码,它仍然有效!,但它仍然无法关闭 yt_up.py 脚本。但是现在键盘中断确实会杀死它(以前没有),以前我使用 CLI 中的 pkill -f yt_up.py
  • yt_up.py 进程可能需要一些时间,而且似乎在执行它的过程中,zenity 输出没有得到处理
  • 确认 zenity 取消在 yt_up.py 进程完成之前不会得到处理。 (我点击取消并等待上传完成,上传后将 zenity 取消参数写入我的日志。我想我需要弄清楚如何同时读取它并采取行动。
  • @Nowski。我无法复制整个设置。您必须找出正确的 kill/pkill 命令。这个问题意味着唯一的问题是检测到取消按钮。 pkil 是否从命令行工作?
  • @Nowski 考虑在脚本中添加“echo” - echo 打印出来了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多