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