Практически мне нужен процесс, который ведет себя так, как будто я нажал Ctrl+Z
сразу после его запуска.
Надеюсь, это можно сделать с помощью сценария оболочки.
(Кроме того, было бы неплохо знать полученный PID, поэтому я мог бы продолжить процесс позже.)
linux
process
background-process
java.is.for.desktop
источник
источник
#!/bin/bash
[введите]$@ &
[введите]PID=$!
[введите]kill -STOP $PID
[введите]echo "Suspended: $PID, press ENTER to continue it"
[введите]read
[введите]kill -CONT $PID
[введите]wait $PID
[введите]echo
Из какой среды вы создаете процесс?
Если вы делаете это из среды, такой как код на C, вы можете выполнить fork (), а затем в дочерней среде отправить SIGSTOP себе перед exec (), предотвращая дальнейшее выполнение.
Более общим решением (вероятно, лучшим) будет создание заглушки, которая делает это. Таким образом, программа-заглушка будет:
Это гарантирует, что вы избежите каких-либо условий гонки, связанных с тем, что новая обработка заходит слишком далеко, прежде чем вы сможете отправить ей сигнал.
Пример для оболочки:
И используя вышеуказанный кодез:
jobs -l
Показывает PID. Но если вы делаете это из оболочки, вам не нужен PID напрямую. Вы можете просто сделать:kill -CONT %1
(при условии, что у вас есть только одна работа).Делать это с более чем одной работой? Оставлено как упражнение для читателя :)
источник
MikeyB ответ правильный. Из этого вопроса о суперпользователе, вот более краткая версия:
Чтобы понять это, нужно понять, как процессы запускаются в Unix:
exec
системный вызов заменяет текущую запущенную программу новой , сохраняя существующий PID. Таким образом, способ создания независимого процесса состоит в том, чтобы сначалаfork
, а затемexec
заменить работающую программу в дочернем процессе желаемой программой.Ингредиенты этой команды оболочки:
(...)
запускают вложенную оболочку: еще один экземпляр BASH.kill
отправляет сигнал STOP этому процессу, который переводит его в состояние ожидания.CONT
сигнал),exec
команда заставит его заменить себя желаемой программой.my_command
сохраняет исходный PID суб-оболочки.$!
переменную, чтобы получить PID процесса.источник
-s STOP
вместо-SIGSTOP
). Все еще удивляетесь: почему это должно быть$BASHPID
вместо$$
? (Я не очень понимаю разницу).$$
vs$BASHPID
я проверяю, что последний - это PID вложенной оболочки, а не первый. Есть забавная проблема: применение подсказки в bash-скрипте, чаще всего, приводит к сбою, и мне приходится делать что-то вроде этого:PID=$!; ps -p $PID; kill -s CONT $PID;
… он терпит неудачу, если я удаляюps -p $PID
деталь: процесс исчезает (убивается?) Без сообщения об ошибке где-либо , Все нормально с интерактивной оболочки, проблема только в скрипте. Это слишком загадочно.$BASHPID
для оболочек, отличных от bash, см. Здесь