Уведомление о завершении удаленного процесса (но без электронной почты)

Я обнаружил, что монтирование с опцией rbind (а не bind) в строке монтирования lxc решает проблему (синтаксис для proxmox):

lxc.mount.entry: /tank/media media none rbind,create=dir,optional 0 0

Отход от документации RedHat по совместному использованию монтирований, rbind обеспечивает репликацию монтирований на источнике в связанном каталоге (это то, что нам нужно), разница в том, что make-rshared позволяет отразить монтирование привязки в источнике.

Только что сам столкнулся с проблемой, и это единственный соответствующий результат в Google, поэтому я подумал, что будет уместно дать ответ, несмотря на давность вопроса.

0
28.11.2016, 16:54
3 ответа

Простейшее решение - использовать выход из tmux, выполнив команду tmux detach, чтобы закрыть соединение ssh, а затем отправьте уведомление, а затем повторно подключитесь и снова подключитесь к tmux. Например, со сценарием

ssh -t remote tmux
notify-send done
ssh -t remote tmux attach

вы запускаете tmux и запускаете свою длительную команду, затем вводите команду

tmux detach

, которая будет запущена, когда длинная команда будет выполнена. Это закроет tmux, закроет ssh, и notify-send покажет ваше сообщение на рабочем столе. Новый ssh ​​снова подключится с того места, где вы остановились.

2
28.01.2020, 02:13

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

Чтобы сделать ситуацию менее запутанной (потому что в этом случае у нас есть обе стороны, либо клиент, либо сервер), я вызову локальную машину, то есть клиента, которого вы подключаетесь к удаленному серверу для запуска долгосрочной задачи, Алиса . Боб затем будет сервером, на котором будет запускаться задача компиляции, на которой затем предполагается уведомить Алису о завершении задачи.

Для этого вам нужно просто сгенерировать ключ, используя ssh-keygen -f notif_key , а затем добавить открытый ключ ( notif_key.pub ) в отдельную строку в вашем Алиса .ssh / authorized_keys , но с добавлением:

command="/path/to/notifier.sh \"$SSH_ORIGINAL_COMMAND\"",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa …

( ssh-rsa… обозначает открытый ключ.)

notifier.sh - это сценарий Алисы. side then, которая затем вызывает команду уведомления (конечно, вы можете начать сразу, если это возможно, просто обратите внимание, что вся строка выполняется в оболочке).

На стороне Боба вы можете затем вызвать уведомление на стороне Алисы, используя ssh , так что в целом вы запускаете Боб внутри сеанса tmux :

time-consuming-command; ssh -i notif_key user@alice_pc foobar

И все!

Кстати, $ SSH_ORIGINAL_COMMAND - это заполнитель для всей дополнительной командной строки для команды ssh , которая затем перенаправляется на принудительную команду. Таким образом вы можете настроить конкретное уведомление от Боба, например когда вы одновременно выполняете несколько задач таким образом.

Пример notifier.sh с учетом этого:

#!/bin/sh
some-notification-command --message "Task '$*' is done!"
echo 'Note to Bob: Alice has been notified.'

В общем, это решение далеко от оптимального. Для этого требуется сервер OpenSSH на клиенте, и его довольно сложно настроить. Я надеюсь, что существуют лучшие решения.

0
28.01.2020, 02:13

В случае, если соединение ssh все еще существует, вы можете использовать переадресацию портов .Я собираюсь называть две машины портативным компьютером и сервером , причем на последнем выполняется длительное задание. Принципиальное преимущество, которое я вижу в этом, - для специальных настроек, например, для подключения с ноутбука в кафе. В этом случае вы будете работать за NAT, вероятно, не сможете открыть порты с помощью PNP. Обычно для этого не требуется ничего устанавливать на сервере. Если это не применимо, воспользуйтесь предложением настроить службу ssh на портативном компьютере.

Вызовите ssh на портативном компьютере и попросите его перенаправить удаленный TCP-порт 4000 на локальный порт 5000. На практике вы должны использовать один и тот же номер порта на обоих концах, я использую разные, чтобы было понятнее, что происходит. Здесь я использую командную строку openssh

ssh -R 4000:127.0.0.1:5000 username@server

Подключаюсь к tmux, запускаю задание, договариваюсь, когда долгое задание завершается, оно записывается на порт 4000.

(long_running job with params ; echo "$?" > /dev/tcp/127.0.0.1/4000) &

Если у вас нет / dev / tcp и он не эмулируется оболочкой, то вы можете использовать что-то вроде echo "$?" | netcat 127.0.0.1 4000

Тем временем на портативном компьютере прослушивайте соединение на порту 5000, предположительно в другом окне.

netcat -l -p 5000; do_something_to_alert_the_local_user.

Netcat заблокирует ожидание подключения сервера к порту 4000, который будет перенаправлен через зашифрованный туннель ssh на порт 5000. После закрытия соединения в конце эха локальный netcat будет выйдите, и do_something_to_alert_the_local_user запустится.

6
28.01.2020, 02:13

Теги

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