- 由用户“staff”运行的脚本运行
zenity --progress
。 - 然后它调用
sudo -u adminBod adminScript
(并且 STDOUT 和 STDERR 被收集到记录器) - 我希望
adminScript
正在运行的程序adminBod
能够写入 zenity 的 STDIN,以便提供更新。
尝试1
我想我可以将通道 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
。
尝试2
然后我想我可以使用命名管道,比如
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
staffer% sudo -u adminBod bash
adminBod% echo '# some update'>/home/staffer/thePipe
这是因为 Zenity 收到消息,但随后它似乎关闭了通道/管道(抱歉不确定正确的术语),以便无法写入进一步的更新。
答案1
使用exec 3>thePipe
让我取得了一些进展......
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
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% 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 在 sudo-ed 子进程结束后继续运行。
我发现exec 3>thePipe
在员工流程中添加一个可以解决这个问题:
staffer% mkfifo -m666 thePipe
staffer% zenity --progress --auto-close <thePipe &
staffer% zenityPid=$!
staffer% exec 3>thePipe #