2010-11-06 6 views
7

Я хочу, чтобы запустить скрипт удаленно через SSH, как это:начиная удаленный скрипт через SSH, содержащий поЬир

ssh [email protected] -t 'cd my/dir && ./myscript data [email protected]' 

Скрипт делает различные вещи, которые работают хорошо, пока он не придет в соответствие с поЬирами:

nohup time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 & 

Предполагается запустить программу myprog, передать ее вывод в mylog и отправить электронное письмо с некоторыми файлами данных, созданными myprog в качестве вложения, а журнал - как тело. Хотя, когда сценарий достигает этой строки, выходы ssh:

Подключение к удаленному сайту.

В чем проблема?

Спасибо за любую помощь

+1

Вы получаете е -Mail? – thejh

+0

Нет. Ни myprog не запущен, ни отправлен mutt. Для тестирования i ssh'ed на пульте дистанционного управления, чтобы проверить, что происходит. Также мой.log пуст (до этого скрипт прикасается). – litro

+0

Что будет?./Myprog' писать в stdout, если его аргументы были неправильными? Что содержит 'myerr.log', когда вы пишете' ./myprog $ 1> my.log 2> myerr.log'? – thejh

ответ

5

Ваша команда запускает конвейер процессов в фоновом режиме, поэтому сценарий вызова будет выходить сразу (или очень скоро после этого). Это приведет к тому, что ssh закроет соединение. Это, в свою очередь, приведет к отправке SIGHUP на любой процесс, подключенный к терминалу, который был создан для создания -t.

Ваш time ./myprog процесс защищен nohup, поэтому он должен продолжать работать. Но вашего mutt нет, и это, вероятно, будет проблемой здесь. Я предлагаю вам изменить свою командную строку на:

nohup sh -c "time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 " & 

поэтому весь трубопровод защищен. (Если это не исправить, может потребоваться что-то сделать с файловыми дескрипторами - например, у mutt могут быть другие проблемы с отсутствием терминала, - или для цитирования может потребоваться настройка в зависимости от параметров, - но попробуйте сейчас ...)

5

This answer может быть полезно. Таким образом, для достижения желаемого эффекта, вы должны сделать следующие вещи:

  1. Перенаправить все I/O на nohup'ed команды дистанционной
  2. Сообщите свою участковую команду SSH, чтобы выйти, как только это сделано запуск удаленного процесса (процессов).

Цитирование the answer I already mentioned, в свою очередь, со ссылкой на wikipedia:

Nohuping справочная работа, например, полезной при входе в через SSH, так как фоновый режим работы может привести к оболочке повесить на выходе из системы из-за гонки условие [ 2]. Эта проблема также может быть преодолена путем перенаправления всех потоков три ввода/вывода:

nohup myprogram > foo.out 2> foo.err < /dev/null & 

UPDATE

Я только имел успех этой модели:

ssh -f [email protected] 'sh -c "((nohup command-to-nohup 2>&1 >output.file </dev/null) &)"' 
+1

Что означает