Я запускаю Lubuntu в виртуальной машине и пытаюсь настроить скрипт, который запускается каждую минуту, чтобы проверить, активен ли VPN, если нет, он все выключает и включает снова. Когда я запускаю скрипт вручную, все работает как задумано, но когда настраиваю как cronjob, он дает сбой почти на каждом шагу.
Во-первых, он не может обнаружить таблицу маршрутизации. При ручном запуске он видит туннель, но при запуске в качестве cron он терпит неудачу и пытается все бросить.
Во-вторых, он не может выполнить дополнительные скрипты/программы настройки. Он доходит до точки «запуска vpn», а затем просто выходит, любой вывод всегда останавливается здесь, но только как cron, запущенный вручную, он запускает программу vpn.
Я также не могу перенаправить вывод в файл, если не добавлять к каждому оператору echo >>/home/localuser1/aqlog.txt. Добавление этого к команде cron ничего не дает.
#!/bin/bash
PATH=/home/localuser1/bin:/home/localuser1/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin
echo "-----------------------------------Script started $(date)"
echo "Check VPN"
if [route | grep tun0 -c ]; then
echo "VPN running, check qbit"
if [pgrep qbit ]; then
echo "All active, no action needed"
else
echo "Not active, starting qbit"
nohup /usr/bin/qbittorrent >/dev/null &
fi
else
echo "no VPN, killing all"
pkill qbit
pkill pia
sleep 2
echo "Starting VPN"
nohup /home/localuser1/.pia_manager/pia_manager/run.sh >/dev/null &
echo "Waiting for VPN to start"
sleep 15
echo "Check VPN active"
if [route | grep tun0 -c]; then
echo "VPN active, starting qbit"
nohup /usr/bin/qbittorrent >/dev/null &
else
echo "No VPN, end of script"
fi
fi
echo "Exiting script"
У меня также есть следующая настройка в crontab, где autoquit.sh — произвольное имя скрипта выше:
# m h dom mon dow command
* * * * * /home/localuser1/autoquit.sh
решение1
Ну, благодаря полезному пользователю на Reddit я смог разобраться, поэтому я подумал, что стоит разместить здесь пост на случай, если кто-то столкнется с тем же препятствием. Проблема в том, что я пытался запустить программу GUI через cron, в котором не передается переменная ENV, то есть она не могла узнать, где отображать. Как только я добавил DISPLAY=:0 черезэтот полезный форумвсе сработало именно так, как и предполагалось, и теперь программы запускаются.
Исправленный код ниже:
#!/bin/bash
PATH=/home/localuser1/bin:/home/localuser1/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin
echo "-----------------------------------Script started $(date)" >>/home/localuser1/aqlog.txt
echo "Checking VPN status" >>/home/localuser1/aqlog.txt
vpnstatus="$(route | grep tun0 -c)"
if [ "$vpnstatus" -gt "0" ]; then
echo "VPN is running, checking qbit" >>/home/localuser1/aqlog.txt
qbitstatus="$(pgrep qbit)"
if [ -n "$qbitstatus" ]; then
echo "All active, no action needed" >>/home/localuser1/aqlog.txt
else
echo "Not active, starting qbit" >>/home/localuser1/aqlog.txt
nohup qbittorrent >/dev/null &
fi
else
echo "no VPN, killing all" >>/home/localuser1/aqlog.txt
pkill qbit
pkill pia
sleep 2
echo "Starting VPN" >>/home/localuser1/aqlog.txt
nohup /home/localuser1/.pia_manager/pia_manager/run.sh >/dev/null &
echo "Waiting for VPN to start" >>/home/localuser1/aqlog.txt
sleep 15
echo "Checking if VPN is active" >>/home/localuser1/aqlog.txt
vpnstatustwo="$(route | grep tun0 -c)"
if [ "$vpnstatustwo" -gt "0" ]; then
echo "VPN is active, starting qbit" >>/home/localuser1/aqlog.txt
nohup qbittorrent >/dev/null &
else
echo "No VPN, end of script" >>/home/localuser1/aqlog.txt
fi
fi
echo "Exiting script" >>/home/localuser1/aqlog.txt
Исправлено задание cron:
# m h dom mon dow command
* * * * * export DISPLAY=:0 && /home/localuser1/autoquit.sh >> /home/localuser1/script_output.txt 2>&1