В вашей службе systemd вы можете настроить запуск VPN после того, как соединение установлено. Решение - изменить директиву After
в файле модуля. Например, служба sshd
находится в этом файле /etc/systemd/system/multi-user.target.wants/sshd.service
и параметр После
принудительно выполняет службу для запуска после сети:
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=network.target
[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
Таким образом, вы должны изменить После
для службы VPN, например vpn.service
Использование файла или стандартного ввода для настройки crontab вновь создает (перезаписывает )содержимое, а не добавляет к тому, что уже может существовать.
Одним из простых решений было бы записать каждую из ваших записей в один файл:
crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
{ crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
>> cron-entry-file
Затем, когда вы соберете все записи, сделайте это только один раз:
crontab -u root cron-entry-file
Если вы создаете свои записи в разных сценариях и/или в разное время, то каждый раз вам нужно будет выполнять:crontab -l > cron-entry-file
для сохранения текущих настроек, затем выполните шаги, описанные выше. (Будем надеяться, что кто-нибудь предложит более изящное решение, но этот -метод грубой силы должен сработать.)
Редактировать
Поскольку ваш сценарий не так прост, как я думал, когда изначально писал вышеизложенное, рассмотрите возможность манипулирования файлом crontab напрямую. Это обычный файл (в каталоге /var/cron/tabs/{username}, например ). Возможно, стоит сначала прочитать это:https://serverfault.com/questions/347318/is-it-bad-to-edit-cron-file-manually
Я обнаружил, что лучший способ обновить записи cron скриптом — это направить их в отдельный файл и получать от него данные cron. В примере, который я привел в вопросе, я сделал следующее:
echo "0 */2 * * * root /root/$VAR/script > /dev/null 2>&1" > /etc/cron.d/$VAR
Это создаст файл, названный в честь переменной в /etc/cron.d/, и будет следовать расписанию, определенному в самом файле. Чище, чем управление crontab, как рекомендуется в этой теме.