2014-11-24 2 views
0

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

Высокий уровень того, что я делаю: я хотел бы иметь сценарий оболочки, чтобы остановить мой процесс. Я бы хотел, чтобы он был достаточно прочным, чтобы убить один или несколько экземпляров процесса, для которого я готовлю. Я не хочу, чтобы он терпел неудачу, если нет никакого процесса (я хочу, чтобы код возврата 0 ... не пустой список аргументов, переданный команде kill)

Что я вижу, так это то, что скрипт ведет себя иначе при вызове путем передачи команды через ssh, чем если бы тот же самый скрипт выполнялся локально. Что очень странно, так это то, что добавив кажущуюся произвольную команду в мою команду ssh, я могу заставить мой скрипт правильно работать, и я НЕ ПОЗВОЛЯЮ ПОЧЕМУ!

Остановка scipt (эхо statments были там, чтобы помочь мне отладки - не является частью реального сценария)

echo "Stopping myProcess" echo "--> пс Окс | grep myProcess | grep -v grep " pid= ps -ef | grep myProcess | grep -v grep | AWK '{печать $ 2}' echo "Here: ${pid}" if [[ ! -z $pid ]]; then echo "Here2" kill -9 $pid else echo "Here3" echo "not stopping anything - no myProcess process running." fi echo "Here4" exit 0

Результат локального выполнения сценария, когда не выполняется никаких процессов:

Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4

Результат выполнения сценария с другой машины, хотя следующая команда:

Команда:

SSH eak0703 @ MYSERVER 'источник $ {HOME}/bash_profile; CD-/usr/local/myprocess/bin/;./stop-myProcess.'

Результат:

Stopping myProcess --> eak0703 2099 0.0 0.0 10728 1500 ? Ss 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess eak0703 2100 0.0 0.0 10740 992 ? S 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess eak0703 2101 0.0 0.0 10740 668 ? S 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess Here: 2099 2100 2105 Here2

Извещение: для некоторых странных и необъяснимых для меня причин, по-видимому, есть 3 вызова моей команды. Я также знаю, что эта команда не заканчивается кодом выхода 0. Я предполагаю, что это происходит потому, что к моменту запуска kill -9 идентификаторы процессов, выбранные grep, исчезли.

Теперь - вот та же команда, SSH с дополнительным "дата | Grep дерьмо" бросили в:

Команда:

SSH eak0703 @ MYSERVER «источник $ {HOME}/bash_profile; CD./usr/local/myprocess/bin /; дата | Grep дерьмо; ./ стоп-myProcess'

Результат:

Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4

Ввод "дата | Grep дерьмо" фиксирует вещи.Похоже, что магия находится в «|» (труба). Поэтому я действительно могу сделать эту работу с «anycommand | anyothercommand».

Я могу заставить его работать, но как я могу оправдать случайное отклонение такого самородка в сценарии bash ??? Никто никогда не узнает, почему это происходит. Даже не я! Если кто-то столкнулся с этим, пожалуйста, помогите!

ответ

2

Анализ ps, чтобы найти способ хрупкий и подверженный ошибкам. Ваш пример хорошая иллюстрация почему:

неродственного процесс (bash процесс, запущенный ssh) содержит имя процесса, как часть командной строки, и случайно подобран вашего ps анализатора.

Несвязанный процесс удаляется вашим grep -v grep, когда вы в командной строке включаете слово «grep».

Вместо этого используйте pgrep или pkill. Эти инструменты перечисляют/уничтожают процессы на основе исполняемого имени и поэтому гораздо более надежны, чем синтаксический анализ ps.

+0

Да! Это верно. Я все еще удивляюсь, почему, похоже, в моей команде bash запущено 3 «экземпляра»? – eak12913

+0

Кроме того - для тех, кто пытается убить один из, возможно, нескольких процессов с тем же именем (например, java), но с разными аргументами и хотел бы использовать pkill/pgrep, они должны, вероятно, использовать флаг '-f', чтобы запрос «Совпадает с полными списками аргументов. Значение по умолчанию - совпадение с именами процессов. ' – eak12913

+0

@ eak0703 1. процесс' bash', вызванный ssh, 2. вилка, которая выполняет ваш скрипт './Stop-myProcess', потому что у него нет shebang, и 3 подселлем из вашей подстановки команды. –

Смежные вопросы