ВЫПОЛНЕНИЕ BASH СКРИПТА ПО РАСПИСАНИЮ
Или "Спокойной ночи, малыши!"
В относительно недавнем прошлом у меня женщина - вреднюша та еще. Пока я распиздяйствовал и не ходил на работу, между нами все было относительно гладко. Однако, когда мы уже начали жить вместе и мне надо было вставать в 7:30 утра, чтобы успеть к 9 на свою боевую вахту в Жилкомитете, оказалось что ей очень трудно перестроиться под нормальный график и раньше двух часов ночи она заснуть никак не может. Да я сам такой, всю жизнь с собой борюсь. Понимаю... любит человек попить чаю в полуночной тишине, посчитать ворон, позалипать в ютубчик и т. д. В итоге месяца два к ряду спал примерно по 5 часов в сутки. Пробовал с ней поговорить - не помогало. Пробовал ругаться - без толку, оказалось даже контрпродуктивно. Ходил по пятам, следил чтобы не начала перекладвать какие-нибудь тряпочки или типа того - один хрен, все бесполезно... Ну, вот по поводу борьбы с залипаниями в Ютубчике как-то раз придумал замечательную идею. Решил автоматизировать процесс выключения ее компьютера, благо, у меня всегда был доступ по ssh. Первая мысль, что пришла в голову - это написать bash скрипт и кинуть его куда-нибудь в автозагрузку. Я очень люблю bash скрипты, но, к сожалению, плохо знаю их синтаксис и не имею ни малейшего понятия как там сделать проверку времени. Поэтому решил скомбинировать их с "плюсами ". Почему бы и нет? Ведь уже кое-что умею...
И вот, такой рецепт.
Сначала следует создать пользователя, чтобы сохранить возможность экстренной загрузки системы при каком-нибудь форсмажоре. Инструкция здесь.
Теперь сделаем пару файлов. Первым будет, собственно, сам sh скрипт.
sudo nano ~/shutdown.sh
С таким содержимым:
#!/bin/bash echo "Проверяем активного пользователя..." sleep 2 echo "Внимание! Пользователь Lara обнаружен!" sleep 1 echo "Нефиг сидеть по ночам за компом!!! А ну, марш в кровать!" sleep 1 echo "Компьютер выкдючится через..." sleep 2 echo "10" sleep 2 echo "9" sleep 2 echo "8" sleep 2 echo "7" sleep 2 echo "6" sleep 2 echo "5" sleep 2 echo "4" sleep 2 echo "3" sleep 2 echo "2" sleep 2 echo "1" sleep 2 echo "Спокойной ночи!!!" sleep 2
shutdown now
Понятное дело, он должен быть исполняемым:
sudo chmod +x ~/shutdown.sh
Далее поработаем над файлом программы, которая проверяет имя пользователя и если этот пользователь - Lara, то узнает время и до восьми часов утра вызывает этот скрипт, а в противном случае ничего не делает.
nano ~/goodnight.cpp
B размещаем в нем следующее содержимое:
#include <string> #include "unistd.h" #include "ctime" using namespace std; int main () { //Перехватываем имя пользователя, запустившего X-сервер char* Usr = getenv("USER"); std::string User; User = Usr; //Запускаем цикл. while(1) { if (User == "Lara") //Запускаем проверку: если пользователь - Lara, то смотрим, сколько времени. { //Обязательно в цикле, потому что время, как известно, не стоит на месте. time_t now = time(0); tm *ltm = localtime(&now); double Time; Time = ltm->tm_hour; //Значение возвращается в формате 24 часа, без минут. Минуты нам не важны. if (Time < 8) { //Если время меньше восьми... Тогда начинаем нашу психическую атаку. sleep (0); //Подождем пару минут, пока загрузится система, откроется ютубчик и т. д. Заодно зададим таким образом интервал цикла. system("gnome-terminal -- sh shutdown.sh"); //Запустим наш зловещий скрипт.
//Тут особенно важно обратить внимание на синтаксис команды запуска gnome-terminal. Это ситнаксис bash-скрипта //Весь прикол этой команды в том, что она запускает терминал в отдельном окне и выполняет в нем команду
break; //Останавливаем цикл, или у нас новые окошки будут открываться по к/д } } } }
Компилируем нашу программку:
g++ -Wall -o goodnight goodnight.cpp
И теперь остается только закинуть всю эту красоту в автозагрузку, после чего комп будет тупо выключаться c 0 до 8 утра. Смотрится эпично. Жаль, дело так и не дошло до реальных испытаний, но, может быть, данное изобретение еще пригодится с другой женщиной или ребенком.
sudo echo "exec goodnight&" >> /etc/X11/xinit/xinitrc
sudo cp goodnight /usr/local/bin/goodnight
reboot
Как добавить программу в автозагрузку, смотрите здесь.