【问题标题】:script not executing all the way through脚本没有一直执行
【发布时间】:2019-08-06 00:12:12
【问题描述】:

我想用一个脚本替换 ifplugd,一个类似守护进程的脚本,将在 i3 启动时启动。从终端启动时一切正常,但每当我尝试在启动时自动启动它时,它就会立即被杀死。

在 i3 启动时我用来启动它的命令:

exec ./.scripts/ifwatch enp0s25>ifwatch.log

日志文件内容:

[17:00:54]:Setting enp0s25 up
[17:00:55]:Listening on enp0s25

它自己的脚本:

#!/bin/sh
dev=$1
echo [$(date +'%H:%M:%S')]:Setting $dev up
sudo ip link set $dev up
echo [$(date +'%H:%M:%S')]:Listening on $dev
while watch -n 5 -g ip link show dev $dev;
do
    if [[ -n $(ip link show dev $dev |tr '\n' ' ' | grep -v 'NO-CARRIER') ]];
    then
        echo [$(date +'%H:%M:%S')]:$dev "connected! running dhcpcd"
        echo $(sudo dhcpcd $dev)
    else
        echo [$(date +'%H:%M:%S')]:$dev "disconnected! killing dhcpcd"
        echo $(sudo dhcpcd -k $dev)
    fi

done

我尝试在屏幕实例中启动它(来自 i3config 文件),但它甚至没有创建套接字,我也尝试不将监视输出缓冲区发送到 /dev/null,但它没有帮助。 我假设该进程会立即被终止,因为在每次启动时,日志文件的时间戳都会更改。

【问题讨论】:

  • 该日志文件内容不是由该脚本创建的。请显示匹配的代码和输出。
  • 很抱歉,我没有注意到日志文件来自旧版本的代码。
  • @TMLKyza:启动是什么意思?电脑什么时候开机?
  • ...不管怎样,就个人而言,我会不顾一切,实现你自己的逻辑;更容易调试,如果没有别的,并且不再依赖于既不是 bash 也不是 POSIX 指定的非标准工具。 last_status=$(ip link show dev "$dev"); while :; do new_status=$(ip link show dev "$dev"); if [[ $new_status != "$last_status" ]]; then last_status=$new_status; ...logic here...; fi; sleep 5; done
  • ...谈到“更易于调试”,set -x 将 stderr 重定向到日志文件始终是您尝试追踪某些内容时的好习惯。 (即:exec 2>/path/to/your.log; set -x,因为脚本的第二行将跟踪写入的每一行转到your.log)。

标签: bash watch archlinux i3


【解决方案1】:

正如Charles Duffy 建议的那样,我编写了一个函数来完成watch -g 的工作,现在它可以完美运行。正如他所说,watch 可能在 TTY 之外无法工作。

如果有人感兴趣,这里是代码:

#!/bin/sh
dev=$1
sleeptime=5

function watcher {
    state1=$(ip link show dev $dev) 
    state2=$state1
    while [ "$state1" == "$state2" ];
    do
        sleep $sleeptime
        state2=$(ip link show dev $dev)
    done
    return 0
}


echo [$(date +'%H:%M:%S')]:Setting $dev up
sudo ip link set $dev up
echo [$(date +'%H:%M:%S')]:Listening on $dev
while watcher;
do
    if [[ -n $(ip link show dev $dev |tr '\n' ' ' | grep -v 'NO-CARRIER') ]];
    then
        echo [$(date +'%H:%M:%S')]:$dev "connected! running dhcpcd"
        sudo dhcpcd $dev
    else
        echo [$(date +'%H:%M:%S')]:$dev "disconnected! killing dhcpcd"
        sudo dhcpcd -k $dev
    fi

done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2021-10-24
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多