выход из сценария оболочки после порождения потоков - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть простой скрипт сказать test.sh что-то вроде этого:

#!/bin/sh

for i in 0 1 2 3 4 5 
do
 ssh BOX someCommand&
done
exit 0

Когда я запускаю скрипт, он запускает 6 процессов и выводит результат на экран, но после его завершения он просто ждет там. Мне нужно сделать Ctrl + C, чтобы выйти. Проблема в том, что я не могу вызывать test.sh несколько раз в другом скрипте, так как он просто будет ждать первого вызова, который завершится навсегда. Какие-либо предложения.

Спасибо

Ответы [ 3 ]

4 голосов
/ 05 апреля 2011

Это на самом деле выходит немедленно. Ваша проблема в том, что скрипт вскоре завершает работу * , прежде чем вывод выводится на экран. Поэтому выходные данные перезаписывают ваше приглашение, а когда вы нажимаете ctrl-c, оно перерисовывает приглашение.

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

Под "выход перезаписывает ваш запрос" я имею в виду:

  • Первый: скрипт завершается
  • Второе: ваша подсказка печатает - "user @ computer $" или что-то еще.
  • В-третьих: выводятся все команды ssh
  • В конце вы остаетесь с курсором на пустой строке без подсказки, что заставляет вас думать, что оно не закрылось. Затем, когда вы нажмете Ctrl-C, приглашение будет напечатано снова.
1 голос
/ 05 апреля 2011

Это должно работать.

Я проделал такую ​​работу, и результат может быть довольно запутанным. Как долго ты ждешь? Вы уверены, что это на самом деле не сделано?

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

Другая возможность состоит в том, что что-то в someCommand на самом деле не заканчивается. Если это скрипт, которым вы управляете, добавьте echo "someCommand on ${HOST} is finished", чтобы убедиться, что каждый скрипт заканчивает работу.

1 голос
/ 05 апреля 2011

Я попробовал что-то похожее, и скрипт завершился правильно

#!/bin/bash

for i in 1 2 3 
do
    ssh id@box "ls -l" &
done

echo "i am done"

Единственная разница - я использую оболочку bash

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