LINUX.ORG.RU

Понять причину «зависания» команды

 , ,


2

1

Привет!

Ситуация такая - периодически приходится выполнять команды по ssh на нескольких хостах сразу, то есть я не захожу на каждый хост интерактивно, а использую конструкцию следующего вида (конечно, используется система управления, но пока это не важно, так что упрощаю):

ssh username@hostname command

Все предусмотреть нереально, и по-этому периодически встречаю ситуацию, когда моя команда повисает - может потребоваться интерактивность в определенном случае, могут быть проблемы с аргументами и т.д. Самый простой пример:

ssh localhost 'grep test'

Можно прибить ssh, но как понять что нужно команде по информации на хосте? Найдя этот процесс в /proc можно посмотреть, что он «спит», при попытке посмотреть его файловые дескрипторы я вижу что-то вроде

$ ls -l
total 0
lr-x------ 1 username username 64 Aug 18 11:08 0 -> pipe:[10856516]
l-wx------ 1 username username 64 Aug 18 11:08 1 -> pipe:[10856517]
l-wx------ 1 username username 64 Aug 18 11:08 2 -> pipe:[10856518]

Иногда команда (прежде чем ожидать получения чего-то от пользователя) выводит что-то на экран, как получить эти данные мне тоже не понятно.

В общем жду рекомендаций о том, как понять что нужно процессу, желательно без установки дополнительного софта (средствами ОС). Заранее спасибо!

★★★★★

Последнее исправление: alozovskoy (всего исправлений: 1)

Напиши скрипт, который будет ждать n секунд и прибивать процесс по таймауту с отправкой админу уведомления с содержимым stdout и stderr прибитого процесса.

Black_Shadow ★★★★★
()
Последнее исправление: Black_Shadow (всего исправлений: 1)

В случае с grep он ждет входного файла, поскольку вы не предоставили файл то берется stdin который в данном случае /dev/null потому что терминал неинтерактивный и все это «зависает».

hidden_4003
()

Иногда команда (прежде чем ожидать получения чего-то от пользователя) выводит что-то на экран, как получить эти данные мне тоже не понятно.

вот что бы такой херни небыло я написал себе «костыль» для группового управления линуксовыми серверами.

если тебе это актуально, черкни на почту.

MikeDM ★★★★★
()
Ответ на: комментарий от MikeDM

Да не, у меня есть уже софтина для этого, спасибо!

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от hidden_4003

Запускаешь команду без ожидания завершения и с перенаправлением:

TMPFILE=`mktemp`
ssh user@host /usr/bin/command &> $TMPFILE &
Последний символ & говорит о том, что оболочка не будет ждать выхода. Получаешь pid процесса:
PID=$!
Дальше отслеживаешь выполнение:
TIMEOUT=30
KILLED=false
while kill -0 $PID; do
    if [ $TIMEOUT == 0 ]; then
        kill $PID
        KILLED=true
        break
    fi
    let "TIMEOUT-=1"
    sleep 1
done
А дальше уведомляешь админа
if [ $KILLED == "true" ]; then
    cat $TMPFILE | mail admin@domain.tls -s "ERROR"
fi
rm $TMPFILE

Black_Shadow ★★★★★
()
Последнее исправление: Black_Shadow (всего исправлений: 1)
Ответ на: комментарий от Black_Shadow

Возможно, если проблемы с сетью, можно включить опцию отваливания по таймауту в самом ssh

derlafff ★★★★★
()
Ответ на: комментарий от derlafff

Тысячи велосипедов, но зачем, если есть dsh?

на то были свои причины. например групповое управление не только linux серверами но и тадададам windows

MikeDM ★★★★★
()
Ответ на: комментарий от Black_Shadow

Очень интересно, спасибо.

Подобного применения kill я ранее не встречал обычно разные костыли с ps, /proc.

hidden_4003
()
Ответ на: комментарий от alozovskoy

Там вроде таймаут подключения, а не выполнения команды

Black_Shadow ★★★★★
()
Ответ на: комментарий от derlafff

О как, понятно. Ладно, прикручу таймаут к «времени жизни» соединения в используемой для управления тулзе.

alozovskoy ★★★★★
() автор топика

ltrace -o trace.log program > out.log 2> error.log

Или:

screen -S session_name program

Если висит - заходишь на тот же хост и screen -r

selivan ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.