![从 shell 脚本内部调用 Clipit](https://linux22.com/image/11255/%E4%BB%8E%20shell%20%E8%84%9A%E6%9C%AC%E5%86%85%E9%83%A8%E8%B0%83%E7%94%A8%20Clipit.png)
我正在尝试使用和clipit
从脚本内部启动。我希望它重新启动 Polybar 并启动所有我想要的程序(如果它们在我重新加载 i3 时尚未运行),但拒绝启动,除非我在终端中手动键入它i3wm
polybar
clipit
#!/usr/bin/env bash
# Terminate already running bar instances
killall -q polybar
echo 'Launching polybar...'
MONITOR=HDMI1 polybar default &
sleep 2
# Start applets if they're not running
for arg in "dunst" "clipit" "wpa_gui -qt"
do
if ! ps ax | grep -v grep | grep -io "$arg"
then
echo "Launching $arg"
exec $arg &
fi
done
echo 'Polybar launched'
exit 0
我也尝试过简单地放入exec clipit
另一个文件,但无济于事。执行的时候没有任何错误。以前,我使用过xfce4-clipman
并且运行良好,我切换的唯一原因是因为clipman
每次退出 i3 时都会截断我的历史记录。
有什么建议吗?
答案1
在您的代码中,第一个命令killall -q polybar
将杀死 Polybar,然后休眠两秒钟。
killall
非常强大,而且它的性能是不可预测的,这意味着我们无法预测完全终止一个进程及其子进程需要多长时间。
根据男人:
killall
是一个提供通过进程名称杀死进程的方法的工具,它通过进程名称向进程发送信号来终止它。
每个信号都有一个当前配置,它决定了进程在传递信号时的行为方式。
所以你必须控制killall
性能。
我认为你的代码会受益于一些修改。例如,代码应该等到查杀过程完全完成。您可以在 后添加线性 killall -q polybar
。这样,代码将等待进程关闭:
#!/usr/bin/env bash
# Terminate already running bar instances
killall -q polybar
# Wait until polybar have been completely shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 2; done
echo 'Launching polybar...'
MONITOR=HDMI1 polybar default &
# Start applets if they're not running
for arg in "dunst" "clipit" "wpa_gui -qt"
do
if ! ps ax | grep -v grep | grep -io "$arg"
then
echo "Launching $arg"
exec $arg &
fi
done
echo 'Polybar launched'
exit 0