0

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たが、役に立ちませんでした。起動するたびにログファイルのタイムスタンプが変更されるため、プロセスが即座に強制終了されると想定しています。

4

1 に答える 1

2

チャールズ・ダフィーが提案したように、私は仕事をする関数を書きましたがwatch -g、今では完全に機能します。彼が言ったように、おそらくwatchTTYの外では機能しません。

誰かが興味を持っている場合のコードは次のとおりです。

#!/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
于 2019-08-05T16:00:44.220 に答える