Когда я запускаю команду ( make
для большого проекта) из оболочки, я могу нажать Ctrl-Z, чтобы остановить процесс и вернуться в оболочку. Впоследствии я могу бежать, fg
чтобы продолжить процесс.
Я пытаюсь написать сценарий оболочки, чтобы автоматизировать это (в частности, проверять температуру моего процессора каждые несколько секунд и останавливать процесс, если он становится слишком горячим, так как мой компьютер подвержен перегреву). Моя первая попытка работала так (упрощенно):
make &
subpid="$!"
sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"
sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"
wait "$subpid"
К сожалению, это не сработало; отправка SIGSTOP процессу не приостановила его (что стало очевидным из продолжения отправки вывода на терминал). Я запустил make &
командную строку, отправил SIGSTOP и проверил состояние процесса с помощью ps
; он был указан как остановленный (и снова начался, когда я отправлял SIGCONT), но он все еще извергал выходной поток и повышал температуру ядра! Остановка с помощью Ctrl-Z никогда не имела этой проблемы, но я не знаю, как это сделать в скрипте.
Чем отличается Ctrl-Z от других kill -STOP
, и как я могу получить поведение первого в сценарии оболочки?
источник
make
запускается рекурсивно. На самом деле, я думаю, что это несколько уровней.Ответы:
CTRL-Z
обычно отправляет SIGTSTP (который может быть заблокирован), и, помимо прочего, оболочки часто сбрасывают tty в ранее сохраненное состояние в этих случаях. Однако, что более важно, для группы процессов управляющего терминала задан PID оболочки (а затем снова PID задания, возобновленного сfg
).Вернемся к исходной проблеме: использование частотно-зависимого масштабирования, такого как, например, Cpufreqd, может быть лучшим молотком для вашего ногтя.
источник
Вы не хотите останавливать
make
процесс; Вы хотите остановитьmake
процесс и все его дочерние процессы. Могу поспорить, что make запускался рекурсивно.Вы можете попробовать
set -m
, а затем использовать%1
вместо"$subpid"
.set -m
Позволяет «контролировать работу», которая по умолчанию отключена скриптов внутри. Я думаю, что это должно работать для вашего случая использования, хотя люди, кажется, думают, что это плохая идея в целом .источник
Вы можете отправить сигнал всем процессам в группе процессов, если вы укажете отрицательное значение PID - PGID лидера сеанса.
Примечание. Для запуска программы в новом сеансе используйте
setsid make
. Но в твоем случае я думаю, что это не нужно. Однако, если make запускается рекурсивно, каждый экземпляр make может быть своим собственным лидером (я не уверен в этом).Другим вариантом может быть использование
killall
:Разница между Ctrl + Z и kill -STOP:
источник
/usr/local/bin/myscript: line 38: kill: (-10202) - No such process
. Фоновые процессы продолжали выполняться. Я не думаю, чтоkillall
подход будет работать, потому что некоторые из подпроцессов кажутсяsh
скорее, чемmake
.make
команды, но когда я делал это из сценария, корневой PID был из самого сценария оболочки ,Ctrl+ Cиспользуется для уничтожения процесса с помощью сигнала
SIGINT
, другими словами, это вежливое уничтожение .Ctrl+ Z используется для приостановки процесса, посылая ему сигнал SIGSTP , который похож на сигнал ожидания , который можно отменить, и процесс можно возобновить снова.
Однако, когда процесс приостанавливается, мы можем возобновить его снова с помощью
fg
(возобновить на переднем плане) иbg
(возобновить в фоновом режиме) , но я не могу возобновить остановленный процесс, в этом разница между использованием Ctrl+ C& Ctrl+ Z.Как просмотреть приостановленный процесс?
Когда у вас есть несколько приостановленных команд, для их перечисления вы используете
jobs
команду, и результат будет:Как убить приостановленный процесс в фоновом режиме?
Используя
kill
команду:kill %n
где п есть номер задания (один в квадратных скобках с выхода рабочих мест), поэтому я хочу , чтобы убить кошку:kill %1
.источник