постоянно работающий скрипт на удалённой машине в Unix - PullRequest
1 голос
/ 13 декабря 2010

У меня проблема при работе с SSH в Unix для запуска скрипта на удаленной машине.Сценарий должен выполняться бесконечно, пока не произойдет событие, и в этом случае он выйдет из своего цикла.К сожалению, кажется, что после короткого переиздания нескольких секунд скрипт перестает работать.Я полагаю, что это связано с SSH, так как сценарий при локальном запуске работает как задумано.

Есть ли способ, с помощью которого я мог бы запустить свою удаленную машину для запуска этого сценария, как если бы он выполнялся локально, чтобы я мог закрытьсоединение SSH и оно все еще будет работать?

Сценарий, который вызывает скрипт, расположенный на удаленном компьютере, таков ::100100 *

 #!/usr/bin/expect set add [lindex $argv 0] set add2 [lindex $argv 1]
spawn ssh -l root2 ${add} /home/jason/localCopy/selfMonitor &
expect *assword: send "BIGMASSIVESECRET\r"
expect "]$ "

Содержащийся в скрипте selfMonitor, в основном, делаетистинное утверждение, которое будет работать до тех пор, пока не сломается.

Любая помощь приветствуется, спасибо.

Ответы [ 4 ]

1 голос
/ 13 декабря 2010

Используйте nohup, чтобы ваш скрипт игнорировал SIGHUP, который отправляется фоновым процессам при выходе из родительской оболочки.

spawn ssh -l root2 ${add} nohup /home/jason/localCopy/selfMonitor &

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

  1. Запустите ssh-keygen на клиенте. Вы можете нажать ввод во всех запросах, чтобы использовать пустой пароль.
  2. Добавить содержимое ~/.ssh/id_rsa.pub в конец файла с именем author_keys на сервере: root2@server:~/.ssh/authorized_keys.

Создание ключа с последующим добавлением его в authorized_keys позволяет клиенту подключаться к серверу без использования пароля и позволяет делать это без жесткого кодирования пароля в текстовом сценарии.

1 голос
/ 13 декабря 2010

Да, вы можете сделать это, используя screen

  • Войти на удаленный компьютер
  • Запустите новый сеанс экрана, набрав: screen
  • Затем запустите ваш скрипт как обычно: ./myscript
  • Затем отсоединить: Ctrl-A, D

Чтобы подключить позже, войдите на компьютер и запустите screen -r, чтобы повторно подключиться к текущему сеансу.

0 голосов
/ 13 декабря 2010

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

Здесь есть хороший HOWTO .

И если ваш скрипт запрограммирован на каком-то популярном языке, например, Perl или Python, вы сможете найти модули для этого.

0 голосов
/ 13 декабря 2010

Чтобы ваш скрипт работал вечно, вам нужно сделать две вещи

  1. Убедитесь, что вы не пишете в терминал.Закройте его или перенаправьте на стандартный вывод stdr и stderr и закройте стандартный ввод.Если вы этого не сделаете, они оставят SSH открытым и / или заставят ваш скрипт завершиться на сломанном канале.
  2. Вам нужно перехватить SIGHUP, который отправляется вашему процессу, когда терминал отключается, и обычнов результате скрипт завершается.

Это делается по-разному на разных языках, поэтому для вашего выбора языка вам нужно найти его.В bash вы используете exec >logfile 2>&1 для перенаправления как stdout и stderr в файл журнала, так и trap "" HUP для игнорирования сигнала HUP.Если вы можете, также запустите новую группу процессов, чтобы сбросить родительский pid на init (официально это делает процесс-демон).

Если вам нужен доступ к выводу терминала из скрипта (и не можетепо любой причине), могу я порекомендовать screen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...