Debian - як запустити скрипт при запуску, як тільки підключення до Інтернету буде готове до використання?


14

Я запускаю Debian 7 Wheezy, і мені потрібно запустити деякі екрани при запуску, як тільки з’явиться повністю функціональний Інтернет-з'єднання. Однак ні, якщо з’єднання з Інтернетом розірвалося і було підключено знову. Тож тільки на першому функціональному підключенні до Інтернету після завантаження.

Чи можете ви, будь ласка, опублікувати фіктивний скрипт для цього і сказати мені, де його поставити і зробити його виконаним за даних умов?

Сценарій потрібно лише запустити екран, а потім закінчити, але екран має продовжуватися.


EDIT Я вже чув про /etc/network/if-up.d/папку. Але як я можу переконатися, що сценарій не буде виконаний знову, якщо з'єднання з Інтернетом буде втрачено та відновлено?


@Celada дивіться правку
MinecraftShamrock

Відповіді:


21

Покладіть свій сценарій /etc/network/if-up.dі зробіть його виконуваним. Він буде автоматично запускатися щоразу, коли з’явиться мережевий інтерфейс.

Щоб змусити його працювати лише при першому запуску кожного завантажувача, попросіть його перевірити наявність файла прапора, який ви створюєте після першого разу. Приклад:

#!/bin/sh

FLAGFILE=/var/run/work-was-already-done

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

: here, do the real work.

Чи буде файл прапора видалено, коли сервер закриється?
MinecraftShamrock

1
Так, тому що на Debian /var/runє летюча файлова система (a tmpfs). Тож гарантовано вийде порожнім при кожному свіжому завантаженні.
Селада

1
Хороший улов. Я думаю, вам довелося б по-справжньому не пощастити, але я думаю, що так, через інтерфейси з гарячим підключенням, які можна було б висувати одночасно. Тож я здогадуюсь, що ти можеш це зробити атомно замість тестування, а потім створити, що би зробило це безпечним, але те, що я придумав з вершини голови, не дуже! python -c 'import os; os.open("/var/run/work-was-already-done", os.O_EXCL|os.O_CREAT, 0)' 2>/dev/null || exit 0
Селада

3
@MinecraftShamrock Якщо ви використовуєте сценарій Celada таким, який є, ваш код запуститься, як тільки з'явиться інтерфейс зворотного зв'язку. Якщо ви хочете зачекати підключення до Інтернету, принаймні перевірте, чи IFACEце не lo- чи якийсь віртуальний інтерфейс - а ще краще, протестуйте на підключення до Інтернету за допомогою pinging.
Жил "ТАК - перестань бути злим"

1
@MinecraftShamrock $IFACEможе мати як значення будь-який інтерфейс, який з'являється. Ви можете перелічити всі існуючі інтерфейси ip linkабо подивитися, які з них налаштовано для сканування/etc/network/interfaces
Celada

9

Ця робота дуже добре підходить systemd.

Запуск сценарію як системна служба

Якщо у вашій системі працює systemd , ви можете налаштувати свій скрипт як запуск системної служби, яка забезпечує контроль над середовищем життєвого циклу та виконання, а також передумови для запуску сценарію, наприклад, мережа, що працює і працює.

Рекомендована папка для ваших власних служб є /etc/systemd/system/(інша опція є, /lib/systemd/systemале її зазвичай слід використовувати лише для служб OOTB).

Створіть файл, наприклад, за допомогою sudo vim /etc/systemd/system/autossh.service:

[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Тепер ви можете протестувати послугу:

sudo systemctl start autossh

Перевірка статусу послуги:

systemctl status autossh

Припинення послуги:

sudo systemctl stop autossh

Після того як ви переконалися, що сервіс працює так, як очікувалося, увімкніть його за допомогою:

sudo systemctl enable autossh

ПРИМІТКА: З метою безпеки systemdсценарій запускатиметься в обмеженому середовищі, подібно до того, як crontabвиконуються сценарії, тому не робіть жодних припущень щодо існуючих системних змінних, таких як $ PATH. Використовуйте Environmentклавіші, якщо ваш сценарій потребує визначення конкретних змінних. Додавання set -xвгорі вашого скрипта bash та його запуску systemctl status my_serviceможе допомогти визначити, чому ваш сценарій не працює. Як правило, завжди використовуйте абсолютні шляхи для всього, включаючи echo, або чітко визначайте свій $ PATH, додаючи Environment=MYVAR=abc.


2

Підключення до Інтернету підводиться записом, /etc/rc6.d/ймовірно S35networking. Якщо ви зміните цей файл і вставте свої команди в кінці, або краще додати до нього /etc/init.d/mystuffта посилання /etc/rc0.d/S36mystuffта вставити там свої команди, тоді це почнеться, як тільки мережа запрацює.


Чи буде зателефоновано, якщо зв’язок втрачено, а потім відновиться? Тому що в іншому випадку я міг би просто поставити сценарій/etc/network/if-up.d
MinecraftShamrock

Ні, це лише під час запуску
Anthon

1
Це спрацює, але тільки для коректності дозвольте мені зазначити, що жоден скрипт у /etc/rc0.dзапуску не буде запускатися, вони працюватимуть при відключенні (рівень запуску 0). При запуску це було б щось у тому /etc/rc2.dчи іншому. Спеціально для Debian хрипів, це так /etc/rcS.d/S12networking. Звичайно, це все посилається на один і той же файл. Також BTW @Anthon дякує за виправлення моєї відповіді: "Будь ласка" замість "Покласти"? Яка дивна друкарня!
Селада

@Celada Ваше право, це rc6 в моїй системі (не в системі Debian). Я не був впевнений, чи хочете ви "Будь ласка, покладіть" туди, але просто "Покласти" видався більш хрустким. До речі, я підтримав вашу відповідь, це просто кращий підхід до роботи в мережі, оскільки він є if-up.dяк загальним механізмом, який також працює на відновлення зв'язку.
Антон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.