从 shell 脚本内部调用 Clipit

从 shell 脚本内部调用 Clipit

我正在尝试使用和clipit从脚本内部启动。我希望它重新启动 Polybar 并启动所有我想要的程序(如果它们在我重新加载 i3 时尚未运行),但拒绝启动,除非我在终端中手动键入它i3wmpolybarclipit

#!/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

相关内容