Получить PID процесса, запущенного с nohup через ssh
Я хочу запустить процесс, используя nohup на удаленной машине через ssh. Проблема в том, как получить PID процесса, запущенного с nohup, поэтомупроцесс на самом деле делает что-то, а не какой-то внешний экземпляр оболочки или тому подобное. Кроме того, я хочу хранить stdout и stderr в файлах, но это не проблема здесь ...
Локально работает без нареканий
nohup sleep 30 > out 2> err < /dev/null & echo $!
Это повторяет мне точный PID команды "спать 30 ", который я также вижу, используя "Топ" или же "ps aux | grep sleep ".
Но я'У меня возникли проблемы с удаленным использованием SSH. Я пробовал что-то вроде
ssh remote_machine 'nohup bash -c "( ( sleep 30 ) & )" > out 2> err < /dev/null'
но я не могу понять, где разместить "эхо $! " так что это отображается в моей локальной оболочке. Это всегда показывает мне неправильные PID, например, один из "Баш» экземпляр и т. д.
У кого-нибудь есть идеи, как это решить?
РЕДАКТИРОВАТЬ: ОК, "Баш-С " может не понадобиться здесь. Как указал Лотарикс, я получаю правильный PID, используя
ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!'
но тогда проблема в том, что если заменитьспать 30 " с чем-то, что производит вывод, скажем, "эхо Hello World! ", этот вывод не заканчивается в файле "из", ни на местной, ни на удаленной стороне. Кто-нибудь понял, почему?
EDIT2: моя вина! На другом устройстве просто не осталось места,почему файлы "из" а также "эээ» остался пустым!
Так что это работает. Кроме того, если вы хотите вызвать несколько команд подряд, разделенных точкой с запятой (;), вы все равно можете использовать "Баш-С ", вот так:
ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!'
Затем распечатывает PIDБаш-С " на местной стороне, что просто отлично. (Невозможно получить PIDсокровенное» или же "занятый" процесс, потому что каждая программа сама может порождать новые подпроцессы, нет способа узнать ...)