ВЫПОЛНЕНИЕ BASH СКРИПТА ПО РАСПИСАНИЮ

Или "Спокойной ночи, малыши!"

goodnight

В относительно недавнем прошлом у меня женщина - вреднюша та еще. Пока я распиздяйствовал и не ходил на работу, между нами все было относительно гладко. Однако, когда мы уже начали жить вместе и мне надо было вставать в 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

Как добавить программу в автозагрузку, смотрите здесь.