Как тайм-аут по часам в Bash (и продолжать тайм-аут, даже если сеанс был закрыт)?

Если у вас есть GNU ls :

ls --time-style=long-iso -l

или

ls --time-style=+FMT -l

, где FMT следует за форматом команды дата . В вашем случае:

ls --time-style=+%Y/%m/%d -l
5
02.01.2017, 08:40
9 ответов

Мне удалось объединить тайм-аут ( sleep ), внешний heredoc, внутренний heredoc (s), nohup , обработку на уровне фона и tty-stdout в следующем скрипте.

Это хорошо, если вам нужен быстрый способ установить что-то, а затем автоматически удалить это через некоторое время:

bash /dev/fd/5 5<< 'EOF0'
#!/bin/bash -x

apt-get install SOME_UTILITY1 -y

cat << EOF1 > ~/utility.sh
sleep 1h
apt-get purge SOME_UTILITY1 -y
EOF1

chmod 755 ~/utility.sh &
nohup ~/utility.sh &

EOF0

Нажмите return (Enter), когда получите следующее сообщение, чтобы продолжить нормальную работу в Bash (появится сообщение в тот момент, когда скрипт достигает nohup :

nohup: добавление вывода в '/USER_LOCATION/nohup.out'

0
27.01.2020, 20:33

Прежде всего, вы должны разделить свой код на два сценария или, по крайней мере, на две отдельные функции в одном сценарии: первый для установки, второй для продувки. Таким образом, при необходимости вы можете запустить любой сценарий / функцию. Оба сценария / функции также должны быть идемпотентными, т.е. они должны пропускать установку / очистку, если это уже сделано.

Затем вы можете просто создать задание cron для вызова сценария очистки каждые 2 часа или создать более периодическое задание cron, которое вызывает сценарий очистки только в том случае, если срок установки не менее 2 часов. Это выдержит перезагрузку сервера, поэтому пакет всегда будет очищен.

1
27.01.2020, 20:33

IMHO, этот подход временно установка и очистка phpmyadmin - уродливый взлом. Вы можете просто ssh -L3307: localhost: 3306 , то есть создать прослушиватель на локальном порту ( -L3307 ), который туннелирует и подключается к удаленному порту ( localhost : 3306 ). Затем, если вы захотите поговорить с удаленной базой данных MySQL, вы просто воспользуетесь localhost: 3307 на локальном компьютере. Вам не нужно ничего устанавливать удаленно, туннель сразу умирает при отключении, и вы можете использовать любой инструмент MySQL локально (например, MySQL Workbench или SQirreL).

0
27.01.2020, 20:33

Как я вижу, у вас есть доступ sudo , и вы можете запускать службы. Таким образом, вы можете использовать службу atd и команду at , чтобы запланировать свою задачу:

echo 'touch $HOME/`date -j +%s`.txt' | at + 2 minutes

И для более чем одной команды у вас есть два варианта:

  1. Объединить echo команды:

     (echo "command1" 
    echo "command2" 
    echo "command3") | в +2 часа 
     
  2. Использовать временный файл для списка команд:

      tmp_file = $ (mktemp --tmpdir uninstall_commands.XXXX) 
    echo "command1" >> $ {tmp_file} { {1}} echo "command2" >> $ {tmp_file} 
    echo "command3" >> $ {tmp_file} 
    at -f $ {tmp_file} + 2 часа 
    rm -f - $ {tmp_file} 
     
2
27.01.2020, 20:33

Вы можете сделать это с помощью утилиты at.

Для одной команды сделайте:

at 'now + 2 hours' -f /path/to/uninstall.sh

Для нескольких команд передайте ваш сценарий в оболочку через cat heredocument:

cat << EOF | at 'now + 2 hours'
command1
command2
........
EOF

Альтернативно, вы можете добиться этого с помощью systemd (опять же, если он у вас установлен)

systemd-run --on-active=2h -- /bin/bash /path/to/uninstall.sh
9
27.01.2020, 20:33

Я не уверен, может ли это решение соответствовать вашим требованиям, но вы можете попробовать.

Если на мгновение забыть о выключении / перезагрузке ПК, то в bash без перехвата терминала будет работать следующее (вы можете попробовать это как однострочную команду для тестирования):

sleep 10 && yad --text="10 seconds passed" && exit &

Выше команда, хотя я этого не ожидал, работает, даже если я закрываю окно терминала.

PS: Если вы объедините его с nohup, команда будет продолжать работать, даже если вы выйдете из системы.

В качестве обходного пути вы можете разделить исходный скрипт на два меньших скрипта; один сценарий для установки один сценарий для удаления, что-то вроде этого:

#script_to_install.sh  
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart
sleep 7200 && path/to/script_to_remove.sh &
exit #exit the first script to free terminal (or even close the terminal)
#end of script_to_install.sh

#script_to_remove.sh
#Optionally you can use xterm -e (or similar) to bring up a terminal window automatically to see the output of the commands
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf
exit
#end of script_to_remove.sh

Возвращаясь к части перезагрузки ПК, я думаю, что это можно решить, записав время начала во временный файл журнала, и после перезагрузки вы можете отслеживать этот временный файл (т.е. с использованием инструментов inotify) для определения истекшего периода времени (не проверено).

0
27.01.2020, 20:33

В bash добавьте ваш сценарий с оператором sleep в файл ~/.bash_logout. В csh это будет .logout.

Мне также понравилось чье-то предложение использовать at. Вы также можете написать сценарий, который будет действовать как функция типа 'police' через cron.

Я нашел это на этом сайте, который может быть полезен: Как запустить скрипт во время выхода из Gnome

0
27.01.2020, 20:33

Предположим, что два сценария ( Do One Thing; Do It Well ):

install.sh

#!/bin/sh -eu
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart

uninstall.sh

#!/bin/sh -eu
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf

Самый простой ответ, который я могу придумать, делает именно то, что вы хотите это

./install.sh && sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1

, где каждый сценарий дополнительно включает команду ssh для подключения к вашему серверу. Такой подход устойчив к отключению и выключению питания сервера, но не к вашему терминальному компьютеру.

В качестве альтернативы я бы упростил этот ответ в основном из-за странного поведения, когда atd помещает свой вывод и вместо этого использует

nohup sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1 &

После выполнения у вас теперь есть примерно 2 часа, чтобы сделать то, что вы хотите сделать, и по истечении времени начнется процесс удаления. Такой подход не устойчив к циклическому отключению питания сервера.

Этот ответ позволяет избежать зависимостей и позволяет проводить диагностику / отладку путем разумного сбора и регистрации соответствующих выходных данных.

1
27.01.2020, 20:33

Есть способы получше.

  1. Установите phpMyAdmin на выделенный виртуальный хост с портом, который вам известен только (скажем, 56887 ).

  2. Настройте knockd , чтобы открыть этот порт по вашему запросу, только для вашего IP.

      [phpMyAdmin] 
    последовательность = 2000,3000,4000 
    seq_timeout = 15 
    start_command = / usr / sbin / iptables -A INPUT -s% IP% -p tcp --dport 56887 -j ACCEPT 
    cmd_timeout = 7200 
    stop_command = / usr / sbin / iptables -D INPUT -s% IP% -p tcp --dport 56887 -j ACCEPT 
     
  3. Используйте удобный knock , чтобы открыть порт:

     knock myserver.example.com 2000 3000 4000 {{1} } 

Вот и все! Переустановка не требуется. Файлы не перемещены.

Применяются обычные меры безопасности посредством оговорок о неразглашении. Небезопасно настроенный phpMyAdmin может быть недостаточно защищен любым подобным взломом. Вы должны правильно его настроить, несмотря ни на что. Но если вы это сделаете, эти хаки станут ненужными.

0
27.01.2020, 20:33

Теги

Похожие вопросы