Я хотел заменить 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
, но это не помогло. Я предполагаю, что процесс мгновенно завершается, потому что при каждом запуске изменяется временная метка файла журнала.
watch
запускает программу снова и снова. Когда он когда-нибудь выйдет, чтобы могла произойти внутренняя часть вашего циклаwhile
? - person Charles Duffy   schedule 05.08.2019while foo; do bar; done
запускаетfoo
, ждет, пока он завершится, затем запускаетbar
и возвращается к началу, еслиfoo
завершился успешно.watch
не завершается ни успешно, ни иначе, поэтому в данном контексте это не имеет смысла. - person Charles Duffy   schedule 05.08.2019watch
не работает без телетайпа. - person Charles Duffy   schedule 05.08.2019last_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
- person Charles Duffy   schedule 05.08.2019set -x
с перенаправлением stderr в файл журнала всегда является хорошей привычкой, когда вы пытаетесь что-то отследить. (То есть:exec 2>/path/to/your.log; set -x
, так как вторая строка вашего скрипта сделает след каждой написанной строки, идущей кyour.log
). - person Charles Duffy   schedule 05.08.2019echo
.echo $(thing)
- это просто глючный и неэффективный способ сказатьthing
(если только вы специально не требуете, чтобы оболочка выполняла токенизацию пробелов и расширение подстановочных знаков на выходе изthing
). - person tripleee   schedule 05.08.2019