Я использую C++ 11 и linux. Я пытаюсь запустить несколько команд ssh с помощью fork() и popen() и отслеживать, когда команда ssh перестает работать. Когда я убиваю команду ssh на другом компьютере, он, похоже, не убивает дочерний процесс fork(), который его запустил. Детский процесс продолжается, пока я не выйду из программы. Что мне нужно сделать, чтобы убить дочерний процесс, когда команда ssh, вызванная с запуском popen(), запущена? Есть ли что-то лучшее, что я мог бы использовать для этого, чем popen(), чтобы вызвать команду ssh?убить подпроцесс, если proc
ответ
дочерний процесс должен периодически запрашивать статус идентификатора процесса ssh и основываться на ответе, который вы возвращаете, решите его убить или нет. вы можете использовать getppid()
для получения родительского идентификатора. После получения идентификатора процесса. Вы можете проверить, если он активен или нет с помощью ниже сценария
if ps -p $PID > /dev/null
then
# pid is active do something
fi
Как запросить статус команды ssh? – user1620479
Я использую kill (pid, 0), чтобы сообщить мне, работает ли он еще. Даже после того, как я убил команду ssh на другом компьютере, процесс все еще говорит о ее запуске. Поэтому я все еще не уверен, как определить, завершилась ли команда ssh – user1620479
«на другом компьютере». Если это означает, что ребенок работает на другом компьютере, вам необходимо отправить сигнал об уничтожении на этот компьютер. –
Вам нужно позвонить wait
или waitpid
для того, чтобы O/S для удаления дочернего процесса. Завершенный дочерний процесс, который не получил статус, полученный его родителем wait
, становится процессом «зомби».
Если вы не заинтересованы в статусе дочернего процесса, но только хотите, чтобы они очищены, вы можете установить обработчик сигнала для SIGCHLD
, который будет срабатывать всякий раз, когда один из вашего ребенка процессов заканчиваются, и вызвать wait
в обработчике «пожинать» ребенка.
Итак, добавьте команду wait() после popen() в дочернем процессе? – user1620479
@ user1620479: если вы имеете в виду wait() сразу после popen() в родительском процессе, да. wait() блокирует вызывающего, однако, это может быть не то, что вы хотите: если родитель не читает выходные данные дочернего процесса, ребенок в конечном итоге зависает из-за полного вывода буферов. Таким образом, обработчик сигналов может быть тем, что вам нужно. –
@ user1620479: Если у вас есть еще одна положительная индикация того, что дочерний процесс мертв (например, файловый дескриптор для его stdout закрыт), вы можете вызвать wait или waitpid, а затем, чтобы пожинать ребенка. –
- 1. Python открытым и убить подпроцесс
- 2. Как убить подпроцесс, если никакой активности в stdout/stderr
- 3. Как эффективно убить замороженный подпроцесс в Python?
- 4. bash - убить подпроцесс после заданного таймаута
- 5. Как убить подпроцесс, запущенный в потоке?
- 6. Как убить подпроцесс с помощью кнопки
- 7. как убить весь подпроцесс в python
- 8. Linux убить подпроцесс уже остановить родителя
- 9. убить подпроцесс, когда процесс python убит?
- 10. Как убить подпроцесс python в windows
- 11. Убить созданный подпроцесс и все созданные им процессы
- 12. подпроцесс, выход скрыть, если ошибка
- 13. Запустите подпроцесс и сохраните, чтобы убить, когда закончили
- 14. Невозможно убить запущенный подпроцесс с использованием Python в Windows
- 15. как убить группу процессов с помощью Python подпроцесс
- 16. Почему подпроцесс не может успешно убить старый запущенный процесс?
- 17. Не могу понять, как убить подпроцесс в Python 3.5
- 18. Как убить подпроцесс, инициированный другой функцией в том же классе
- 19. В Python 2.5, как я могу убить подпроцесс?
- 20. Как убить подпроцесс, вызванный с помощью subprocess.call в python?
- 21. Предоставляет ли java.io.Process выход для вывода, даже если подпроцесс вышел?
- 22. Python - убить зависший процесс начал использовать subprocess.Popen
- 23. Подпроцесс Python 3.4
- 24. Убить процесс, если он существует
- 25. Прекратить подпроцесс в Windows, доступ запрещен
- 26. Подпроцесс.
- 27. Python kill parent script (подпроцесс)
- 28. Подпроцесс Python.Popen() и источник
- 29. Подпроцесс подпроцесса Python() терпит неудачу, если многопроцессор. Создается пул
- 30. Подпроцесс Python не заканчивается
запустить программу в gdb и поймать сигнал, который возникает при удалении оболочки удаленного узла. Я не помню сигнал, который будет поднят. – Pradheep
И как именно я это сделал? – user1620479
в оболочке gdb yourprogramname – Pradheep