zenity --progress。sudo -u adminBod adminScript (并将STDOUT和STDERR收集到记录器中)adminScript运行的adminBod能够写入zenity的STDIN,以便提供更新。我想我可以通过管道3到zenity的STDIN,然后从我的sudo过程中写到:
#!/bin/bash
# Main script, run by 'staffer'
{
echo "# Starting work"
exec 3>&1
sudo -u adminBod adminScript 2>&1 | logger -t myTag
exec 3>&-
echo "100" # tells Zenity we're at 100% and it can close
} zenity --progress --auto-close#!/bin/bash
# adminScript, run by adminBod
echo "# some message for zenity" >/dev/fd/3
echo "# some message for zenity" >&3这不起作用,因为/dev/fd/3不存在于adminBod。
然后我想我可以用一个命名的管道,就像
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close /home/staffer/thePipe这是因为Zenity接收到消息,但是它似乎关闭了通道/管道(抱歉,不确定正确的术语),这样就不能编写进一步的更新了。
发布于 2023-05-26 11:19:17
用exec 3>thePipe让我在去那里的路上.
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close /home/staffer/thePipe
adminBod% echo '# some update' >&3
adminBod% sleep 1
adminBod% echo '# some new update' >&3
adminBod% sleep 1
adminBod% echo '100' >&3 # will close due to --auto-close
adminBod% exit # this will also close '3' and cause zenity to close但问题是,当adminBod会话结束时,管道也是如此。我希望zenity在子进程结束后继续运行。
我发现在员工的过程中放置一个exec 3>thePipe可以解决以下问题:
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close thePipe # New line
staffer% sudo -u adminBod bash
adminBod% exec 3>/home/staffer/thePipe
adminBod% echo '# some update' >&3
adminBod% sleep 1
adminBod% echo '# some new update' >&3
adminBod% exit
staffer% echo '# still running!' >&3
staffer% echo '100' >&3 # will close due to --auto-close
staffer% [[ -e /proc/pid/$zenityPid ]] && kill $zenityPid # kill if not already killed?值得注意的是,一旦exec 3>thePipe命令运行,zenity就会显示UI。在我看来,exec命令“打开”管道并保持其打开,这就是zenity不再关闭的原因。
然而,我们应该能够关闭一个编号的管道与exec 3>-,但这给予“许可拒绝”。因此,我不知道是否有办法关闭管道(就像在OP中使用简单的echo ... >thePipe)和/或未重定向的3。
所以其他的答案仍然值得欢迎。
的尾部-f建议
我可以让它这样运作:
staffer% mkfifo -m666 thePipe
staffer% tail -f thePipe | zenity --progress --auto-close
staffer% echo '# some update' >named
staffer% echo '# some new update' >named # also works :-)
staffer% sudo -u adminBod bash
adminBod% echo '# update from admin' >named
adminBod% exit
staffer% echo '# still working' >named这种方法的一个优点是,如果你存储它的pid,然后杀死尾巴(坏了的管道),你就可以杀死它。得到tail的S pid是一个再硬一点。而且,我喜欢它不会把通道/编号管道3锁在thePipe中,感觉更干净。
https://unix.stackexchange.com/questions/747091
复制相似问题