2015-12-06 3 views
2

Я управление удаленной машины Linux через SSH, мне нужно, чтобы иметь возможность знать идентификатор процесса во время его работы и его статуса выхода после запускаПечати идентификатора процесса только начала процесса до его выхода

Моя попытка состояла в том, чтобы выдать эту команду через SSH

my_cmd & echo $ !; wait $ !; echo $ ?;

Выход, таким образом, следующее, что именно мне нужно:

pid 
...stdout... 
exit_status 

Теперь иногда бывает так, что, видимо, команда слишком быстро, так что я получаю что-то вроде:

...stdout... 
pid 
exit_status 

Есть ли способ предотвратить такое поведение?

ответ

2

При запуске фоновой программы это независимый процесс, и необходимо выполнить некоторую синхронизацию, если требуется выход в определенном порядке. Но это частность, может быть легко решена с помощью Exec и дополнительного скрипта:

Первого сценария, скажет start:

#!/bin/bash 
start2 & 
wait $! 
echo $? 

второй сценарий start2:

#!/bin/bash 
echo $$ 
exec my_cmd 

Теперь первый сценарий начинает второе один и ждет результата. И второй скрипт печатает собственный pid, а затем запускает программу, которая будет работать с тем же pid, что и второй скрипт.

+0

Спасибо! Я использовал вашу идею и немного изменил ее, чтобы написать 'bash -c 'echo $$; exec my_cmd '; echo $? '. Он работает хорошо до сих пор, я задаюсь вопросом, является ли это также стабильным решением. –

+0

Кажется, но я думаю, что 'echo $?' Не будет вызываться, потому что оболочка вызывает exec раньше. Поэтому я думаю, что распечатки будут исправлены, но результат не будет напечатан. Тем не менее, я не испытал этого. –

+0

На самом деле пока это кажется правильным –

0

Да, когда вы используете &, вы вызываете фоновый процесс с его выходом на stdout, как вы это иллюстрировали ... И в этом все дело. Выполнение вашего процесса и печать stdout происходит быстрее, чем запрос pid и печать и т. Д. Итак, я рекомендую вам перенаправить stdout в файл/tmp/tempfile, а затем распечатать его точно, когда вам нужен вывод для печати. ... Пример:

$ o=/tmp/_o; your_cmd 1>$o 2>$o & echo "pid is $!"; wait $!; r=$?; cat $o; echo "return is $r"; rm -f $o

мы сначала выходные переменная 'о' в 'TMP// _o' временного файл

затем бежит your_cmd перенаправлять весь вывод (1 и 2, что означает стандартный вывод и stderr) до $ o (что указывает на/tmp/_o).

мы показываем ИДП

тогда мы ждем PID

Затем мы устанавливаем обратный Var «г» (показать его после выхода)

мы сцепить вывод, показывая это для вас как вы хотите ..

мы показываем возвращению

затем убирает временный файл «O» ..

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

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