Как-то я писал про бесплатный linux shell от провайдера Bshellz в заметке Бесплатный Linux-shell с Tmux на борту. Там же был приведён способ автоматического продления аккаунта — путём отправки (по расписанию) служебного сообщения боту Beschbot с помощью имеющегося на самом хостинге IRC-клиента irssi. Время показало, что способ, как и следовало ожидать, не лишён недостатков. А именно — периодически сервер Bshellz перезагружается, после чего настройка расписания в irssi слетает. Также — несколько раз наблюдались проблемы с подключением клиента к сети Freenode IRC. В результате возникло решение зарезервировать автообновление аккаунта в Bshellz путём использования дополнительного внешнего скрипта, также запускающегося по расписанию (раз в день в произвольное время, на домашней машине).
Непосредственно сам скрипт доступен по ссылке: bshellz-autorenew.pl. Принцип действия примитивен — подключается к Freenode IRC, заходит на канал #bshellz и даёт боту Beschbot команду продлить «время жизни» указанного в настройках аккаунта (в моём случае — аккаунт dimio): PRIVMSG Beschbot :!keep dimio
.
Некоторых пояснений могут потребовать разве что настройки скрипта (изменяются в нём же самом). На части из них и остановлюсь чуть подробней:
my $opt = {
server_name => 'irc.freenode.net',
server_port => '6667',
channel => 'bshellz',
bot_name => 'Beschbot',
nickname => 'dimio',
bshellz_name => 'dimio', # name of bshellz account
verbose => 0, # print irc server responses & debug data
print_log => 1, # print Beschbot "!keep" response for cron sending report email
};
- channel — название канала, на который будет заходить скрипт;
- bot_name — пользователю с указанным здесь именем будет отправлено сообщение от продлении аккаунта;
- nickname — ник для IRC, любой, допускаемый правилами сети;
- bshellz_name — название аккаунта в Bshellz, для которого требуется запросить продление времени жизни;
- verbose — вывод отладочной информации, может принимать значения от 0 (не выводит никакой отладочной информации) до 2 (выводит полный лог запросов-ответов сервера);
- print_log — 0 (не выводить) или 1 (выводить) ответ бота на запрос о продлении аккаунта, при запуске через планировщик заданий — ответ попадёт в отчёт планировщика, что удобно.
После запуска скрипта с приведёнными в примере выше настройками должно быть получено ответное сообщение от Beschbot:
dimio@ibm:~$ perl bshellz-autorenew.pl
bshellz-autorenew.pl: :Beschbot!beschbot@services.bshellz.net PRIVMSG dimio :dimio's shell has 168 more hours to live!
— скрипт отработал успешно, время жизни аккаунта dimio продлено на 168 часов.
Запуск скрипта по нерегулярному расписанию (cron, anacron)
Основной вопрос — запуск скрипта. Поскольку он резервный — запуск у меня происходит на домашней машине, а она, в свою очередь, работает не круглосуточно. Использование «чистого» cron в таких условиях — не очень удобно (в указанное в расписании время запуска компьютер может быть выключен). Мне пришли в голову два выхода: применить anacron (anachronistic cron) или сделать простенькую shell-обёртку для запуска скрипта при помощи обычного cron. Первый вариант удобен тем, что используется готовый инструмент (который, однако, может потребоваться сначала установить), а второй вариант — удобен отсутствием необходимости устанавливать дополнительные утилиты.
Вариант первый — запуск через anacron
Запуск скрипта можно прописать в /etc/anacrontab
непосредственно (см. пример ниже) или положить его (ссылку на него) в /etc/cron.daily/
(в этом случае файл скрипта должен быть исполняемым).
# format: period delay job-identifier command
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
@daily 5 bshellz-autorenew perl /home/dimio/bshellz-autorenew.pl
Формат anacrontab следующий: периодичность запуска задачи, задержка перед запуском задачи после старта системы, имя задачи и выполняемая команда.
Проверяем срабатывание — задача была создана, время последнего выполнения — указано в /var/spool/anacron/bshellz-autorenew
:
dimio@ibm:~$ ls -lh /var/spool/anacron/
...
-rw------- 1 root root 9 мар 15 11:35 bshellz-autorenew
dimio@ibm:~$ cat /var/spool/anacron/bshellz-autorenew
20170314
Вариант второй — cron плюс обёртка для запуска
Небольшой shell-скрипт cron_daily_bshellz.bash, который будет запускаться по расписанию обычного cron, но выполнять указанную задачу только раз в сутки. В crontab запуск у меня поставлен раз в 30 минут:
*/30 * * * * if [ "$(shuf -i '0-10' -n 1)" -gt 5 ]; then sh /home/dimio/bshellz-autorenew/cron_daily_bshellz.bash; fi
Под спойлером — лог запуска этого скрипта для проверки его работы, если кому интересно.
Первый запуск:
dimio@ibm:~$ sh -x cron_daily_bshellz.bash
+ LOG_FILE=/home/dimio/log/cron_daily_bshellz.bash.log
+ RUN_FILE=/home/dimio/bshellz-autorenew.pl
++ which perl
+ PERL_BIN=/usr/bin/perl
+ '[' '!' -r /home/dimio/log/cron_daily_bshellz.bash.log ']'
+ touch /home/dimio/log/cron_daily_bshellz.bash.log
++ date +%Y-%m-%d
+ CURR_DATE=2017-03-14
++ tail --quiet --lines=1 /home/dimio/log/cron_daily_bshellz.bash.log
++ cut '--delimiter= ' --fields=1
+ LAST_RUN_DATE=
+ '[' -n '' ']'
+ eval '/usr/bin/perl /home/dimio/bshellz-autorenew.pl'
++ /usr/bin/perl /home/dimio/bshellz-autorenew.pl
/home/dimio/bshellz-autorenew.pl: :Beschbot!beschbot@services.bshellz.net PRIVMSG dimio :dimio's shell has 168 more hours to live!
++ date +%H:%M
+ echo '2017-03-14 13:37'
+ exit 0
Повторный запуск в тот же день:
dimio@ibm:~$ sh -x cron_daily_bshellz.bash
+ LOG_FILE=/home/dimio/log/cron_daily_bshellz.bash.log
+ RUN_FILE=/home/dimio/bshellz-autorenew.pl
++ which perl
+ PERL_BIN=/usr/bin/perl
+ '[' '!' -r /home/dimio/log/cron_daily_bshellz.bash.log ']'
++ date +%Y-%m-%d
+ CURR_DATE=2017-03-14
++ tail --quiet --lines=1 /home/dimio/log/cron_daily_bshellz.bash.log
++ cut '--delimiter= ' --fields=1
+ LAST_RUN_DATE=2017-03-14
+ '[' -n 2017-03-14 ']'
+ '[' 2017-03-14 = 2017-03-14 ']'
+ exit 0
Вот и всё, теперь аккаунт Bshellz защищён от удаления дополнительным инструментом, помимо использованного ранее автопродления регистрации Bshellz через irssi.
Йо! Мэн, я с бшелзом знаком хз с каких лохматых годов, тоже когда-то маялся с автопродливалками, потом плюнул и задонатил 20 евро за пожизненный аккаунт. Какое-то время контактировал с Вуком — он временно админил бшелловские сервера, а сейчас там какой-то кромешный мрак. Главная — в дауне, на письма никто не отвечает.
Я всякую мелочь тестирую, но у меня доступа к логам апача нет — даже не знаю к кому обращаться. Вероятно прийдется на фриноде вылавливать кого-нибудь, но может быть у тебя есть контакты?
Заранее благодарен!
Нету. Сам пытался в ирке выяснить, почему периодические ошибки с логином на сервер, но глухо. А потом логиниться вовсе перестало, так что плюнул в итоге. Донатить за это — ну уж нет, лучше VPS за бакс в месяц взять.
А где VPS за один бакс? И как он? Стабильный?
arubacloud например. Как шелл и точка для проброса VPN — нормально. В принципе, если мониторить скидки — можно и у более именитых хостеров похожую цену поймать.