2013-04-04 2 views
0

У меня есть код, который имеет тенденцию к случайному зависанию внутри его «для цикла». Я ищу решение, которое автоматически уничтожит PID сеанса ssh, если он существует в течение 5 секунд. Я сейчас убиваю подвесные процессы вручную, но я хочу поместить это в cron, так что автоматическое убийство PID было бы потрясающе.Убейте процесс, сгенерированный циклом for после определенного времени

for host in `cat $WORKDIR/linux_hosts.txt $WORKDIR/aix_hosts.txt` 
do 
    ssh -o LogLevel=QUIET -o ConnectTimeout=2 -t $host "cat /etc/passwd" >> $FILEDIR/$host 
done 

Спасибо за помощь!

ответ

2

Запустите все ssh процессы в фоновом режиме, затем подождите 5 секунд. Как только вернется, используйте jobs -p, чтобы получить идентификаторы процессов любых фоновых заданий, которые все еще выполняются, и убить их.

cat "$WORKDIR"/{linux_hosts.txt,aix_hosts.txt} | while read host; do 
    ssh -o LogLevel=QUIET -o ConnectTimeout=2 -t "$host" "cat /etc/passwd" >> "$FILEDIR/$host" & 
done 
sleep 5 
kill $(jobs -p) 2>/dev/null 
+0

Я вижу, что вы здесь говорите. Я могу настроить его немного, чтобы убить именно тот процесс, который я хочу. Много моей проблемы было просто не зная, как объединить эти вещи вместе. Я посмотрю, что он делает. Благодаря! – SteveHNH

+0

Изучив это, похоже, что на самом деле он будет спать 5 секунд каждый раз, когда он проходит через цикл. Это значительно увеличит время выполнения скрипта, так как оно превышает 400 раз. Один проход через цикл, как правило, завершается через 1-2 секунды, когда он работает правильно. – SteveHNH

+0

Итак, запустите * all * ssh и убейте всех, которые все еще работают после одного 5-секундного периода. Я обновлю. – chepner

0

Использование timeout:

for host in `cat $WORKDIR/linux_hosts.txt $WORKDIR/aix_hosts.txt` 
do 
    timeout 5s ssh -o LogLevel=QUIET -o ConnectTimeout=2 -t $host \ 
        "cat /etc/passwd" >> $FILEDIR/$host 
done 
+0

Это начало сбрасывать сообщения 'tcsetattr: Interrupted system call', как только истекает время ожидания, независимо от того, был ли этот точный процесс запущен или нет. Как ни странно, бежал один, все было хорошо, но внутри «петли» он сломался. Спасибо за предложение! – SteveHNH

0

Найдет и убить всех ssh процесс старше 5 минут.

cd /proc 
kill $(find $(pidof ssh) -maxdepth 0 -mmin +5) 
+0

Мне нужно, чтобы обработанный был убит намного раньше, чем 5 минут. Я также не хочу, чтобы он убивал каждый процесс ssh, так как он убивал бы любые сеансы ssh вне этого скрипта. – SteveHNH

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