脚本没有一直执行
script not executing all the way through
我想用一个脚本替换 ifplugd,一个类似守护进程的脚本,将在 i3 启动时启动。从终端启动时一切正常,但每当我尝试在启动时自动启动它时,它会立即被杀死。
i3 启动时我用来启动它的命令:
exec ./.scripts/ifwatch enp0s25>ifwatch.log
日志文件内容:
[17:00:54]:Setting enp0s25 up
[17:00:55]:Listening on enp0s25
脚本本身:
#!/bin/sh
dev=
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
但它没有帮助。
我假设进程立即被杀死,因为在每次启动时,日志文件的时间戳都会改变。
按照 Charles Duffy 的建议,我编写了一个函数来完成 watch -g
的工作,现在它运行良好。正如他所说,可能 watch
在 TTY 之外不起作用。
下面是代码,如果有人感兴趣的话:
#!/bin/sh
dev=
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
我想用一个脚本替换 ifplugd,一个类似守护进程的脚本,将在 i3 启动时启动。从终端启动时一切正常,但每当我尝试在启动时自动启动它时,它会立即被杀死。
i3 启动时我用来启动它的命令:
exec ./.scripts/ifwatch enp0s25>ifwatch.log
日志文件内容:
[17:00:54]:Setting enp0s25 up
[17:00:55]:Listening on enp0s25
脚本本身:
#!/bin/sh
dev=
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
但它没有帮助。
我假设进程立即被杀死,因为在每次启动时,日志文件的时间戳都会改变。
按照 Charles Duffy 的建议,我编写了一个函数来完成 watch -g
的工作,现在它运行良好。正如他所说,可能 watch
在 TTY 之外不起作用。
下面是代码,如果有人感兴趣的话:
#!/bin/sh
dev=
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