Как я могу предупредить на завершении долгой задачи по ssh?

Не использовать crontab -e

Я не вставил бы его crontab -e как корень. Это обычно менее очевидно для других администраторов и, вероятно, будет теряться со временем. Вставление их /etc/crontab можно указать точно время, когда Вы хотите, чтобы они работали, и можно указать другого пользователя также.

Альтернативные местоположения

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

Например, под основанными на Redhat дистрибутивами:

$ ls -dl /etc/cron*
drwxr-xr-x. 2 root root 4096 Nov 29 11:06 /etc/cron.d
drwxr-xr-x. 2 root root 4096 Nov 29 11:06 /etc/cron.daily
-rw-------. 1 root root    0 Nov 23 07:42 /etc/cron.deny
drwxr-xr-x. 2 root root 4096 Nov 29 11:03 /etc/cron.hourly
drwxr-xr-x. 2 root root 4096 Nov 29 11:06 /etc/cron.monthly
-rw-r--r--. 1 root root  457 Sep 26  2011 /etc/crontab
drwxr-xr-x. 2 root root 4096 Sep 26  2011 /etc/cron.weekly

Я часто буду времена помещать системные кроны уровня, в которых я хочу работать в определенное время /etc/cron.d вместо /etc/crontab, особенно, если они - более сложные сценарии.

Я предпочитаю использовать каталоги под /etc/cron* потому что они - намного более очевидное место, которое другие системные администраторы будут знать для взгляда, и файлами здесь можно управлять через установки пакетов такой как rpm и/или apt.

Защита записей

Любой из каталогов, которые я упомянул, определяется для помещения сценариев, которые не будут уничтожены диспетчером пакетов. Если бы Вы обеспокоены защитой crontab записи, то я определенно не вставил бы ее /etc/crontab файл, и вместо этого помещенный это как надлежащий сценарий в одном из /etc/cron* каталоги.

3
03.04.2015, 17:58
3 ответа

Самая простая вещь, которую я могу себе представить, состоит в том, чтобы использовать вторую сессию SSH для пересылки именованного FIFO. Я предполагаю, что у вас есть TMP / в вашем доме; Не стесняйтесь держать FIFO, куда угодно.

local$ ssh me@remotehost 'mkfifo ~/tmp/alert_fifo ; while cat ~/tmp/alert_fifo ; do : ; done' | \
    while read icon_name text ; do
        notify_send --urgency=low -i "$icon_name" "$text"
    done &

Затем вы можете позволить этому запустить на заднем плане, пока вы открываете вторую сессию SSH, чтобы сделать вашу реальную работу:

local$ ssh me@remotehost
remote$ alias remote_alert='echo ... >~/tmp/alert_fifo'
remote$ long_running_command; remote_alert

... где Remote_alert является измененным Alios С Notify_Send - Rugency = Low -i заменен эхообразными вещами в FIFO.

Это будет работать с минимальным набором инструментов на удаленном компьютере: только утилиты SSH и стандартных POSIX. Однако с FIFO, если вы забудете запустить ваш читатель (или ваш читатель умирают), то ваш писатель повесится. Так что, если у вас есть SOCAT , вы можете сделать это немного больше прощения:

local$ ssh me@remotehost 'socat UNIX-RECV:~/tmp/alert_socket -' | \
    while read ...
        ...
    done &

local$ ssh me@remotehost
remote$ alias remote_alert='echo ... | socat - UNIX-SEND:~/tmp/alert_socket'
3
27.01.2020, 21:23

Это частичный ответ. См. Аутентификация и авторизация D-Bus , чтобы узнать о точках, на которых я застрял.

notify-send отправляет сообщение по D-Bus . Современные настольные среды запускают шину D-Bus для каждого сеанса и организуют для программ в сеансе поиск нужной шины, как правило, путем установки переменной среды DBUS_SESSION_BUS_ADDRESS . D-Bus поддерживает несколько способов подключения к демону, который централизует и отправляет сообщения, включая абстрактные сокеты, сокеты unix и TCP.

OpenSSH ≥6.7 может пересылать сокеты Unix , но, как я пишу, очень немногие системы работают с такой последней версией.

Вы можете запустить демон D-Bus, который прослушивает TCP (вы можете заставить его прослушивать несколько адресов, например TCP и сокет Unix). Это может быть сложно организовать, если dbus-daemon запускается сценариями запуска вашего сеанса таким образом, на который вы не можете повлиять.

Вы можете перенаправить абстрактный сокет D-Bus или именованный сокет Unix через TCP с помощью таких инструментов, как netcat или socat . Вот проверочный сценарий, который устанавливает пересылку на TCP-порт 8004.

#!/bin/sh
case $DBUS_SESSION_BUS_ADDRESS in
  '') echo 1>&2 "No local D-Bus instance";;
  unix:abstract=*,guid=*)
    guid=${DBUS_SESSION_BUS_ADDRESS##*[:,]guid=}
    guid=${guid%%,*}
    socket=${DBUS_SESSION_BUS_ADDRESS##*[:,]abstract=}
    socket=ABSTRACT-CONNECT:${socket%%,*}
    ;;
  unix:path=*,guid=*)
    guid=${DBUS_SESSION_BUS_ADDRESS##*[:,]guid=}
    guid=${guid%%,*}
    socket=${DBUS_SESSION_BUS_ADDRESS##*[:,]path=}
    socket=UNIX-CONNECT:${socket%%,*}
    ;;
  *) echo 1>&2 "Unsupported DBUS_SESSION_BUS_ADDRESS";;
esac
socat "TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32" "$socket"

Теперь вы можете пересылать это TCP-соединение через SSH.

ssh -R 8004:localhost:8004 me@example.net
me@example.net$ export DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004

Вам нужно сделать еще одну вещь: скопировать cookie авторизации на удаленную машину.

rsync -a .dbus-keyrings/org_freedesktop_general me@example.net:.dbus-keyrings/org_freedesktop_general

Помните, что, в отличие от cookie X11, cookie D-Bus может изменяться в течение срока службы сервера. Фактически, в моих экспериментах казалось, что оно меняется нерегулярно, иногда всего через несколько минут.

Насколько я могу судить, только последние версии библиотек Gnome читают файл cookie. notify-send действительно читает его на FreeBSD 10.1 с Gnome 3.14, но не на Debian wheezy с Gnome 3.4.

0
27.01.2020, 21:23

Вы можете установить терминатор эмулятора терминала. Затем щелкните правой кнопкой мыши на своем терминале и выберите «следить за активностью» или «следить за тишиной». Это уведомит вас, как только вывод будет произведен в терминале или не будет произведен вывод в течение некоторого времени, соответственно. Если ваша команда не производит вывод, вы можете просто добавить что-то вроде ; echo "{!1} Done!"в конец вашей команды. Я создал расширение для терминатора, которое уведомляло меня каждый раз, когда в выводе появлялось определенное ключевое слово. Хотя я потерял код. Программирование довольно простое, если вы используете существующие расширения и разбираетесь в Python. Дополнительным преимуществом является то, что он работает одинаково, даже если вы туннелируете через цепочку ssh-соединений.

1
27.01.2020, 21:23

Теги

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