Проблема почти в том, что ваше задание cron @reboot
началось до того, как появились ваши сетевые интерфейсы up
. В общем, это хорошо -задокументированный недостаток cron
. Это не означает, что средство @reboot
бесполезно, это просто означает, что вам нужно понять, как оно работает, и как обойти его в случае сбоя -, как это было в вашем случае (, вероятно :).
Есть как минимум 2 способа сделать это:
sleep
в своем задании @reboot, чтобы дать сети больше времени для получения up
. Ваша запись crontab
будет выглядеть примерно так::@reboot sleep 10; /your/bash/script/as-it-is-now
Я предложил значение 10
здесь, чтобы дать интерфейсу 10 секунд до прибытия up
; YMMV, так что поэкспериментируйте с разными значениями.
/etc/network/if-up.d
. Ниже приведен прототип, который может быть полезен. Обратите внимание, что он запускается только при первом запуске вашей системы (, например @reboot
, а НЕ при каждом подключении сетевого интерфейса up
):#!/bin/sh
NWKSTATUS=/var/run/the-network-is-up
# note that /var/run is a temp fs, and so a system shutdown
# will effectively erase our flag file, 'the-network-is-up'case "$IFACE" in
lo)
# Exclude the loopback interface; we won't consider it
# as it's not a true interface. We set the flag only
# when a true network interface comes up
exit 0
;;
*)
;; esac# if the flag file exists, we're done here
# otherwise, we'll create itif [ -e $NWKSTATUS ]; then exit 0
else
touch $NWKSTATUS
fi# add your script here...
Итак, -поместите все вышеперечисленное в файл (, например. setnwkstatus.sh
), затем сохраните его в папке /etc/network/if-up.d/
и сделайте исполняемым (т.е.sudo chmod /etc/network/if-up.d/setnwkstatus.sh
)
Если вы используете zsh
, эта конструкция работает:
date > file1 > file2 > file3
При работе в bash
только file3
будет содержать вывод.
Используйте tee
, но перенаправьте «последний» стандартный вывод на/dev/null
:
date | tee file file2 file3 >/dev/null