Яка різниця між Ctrl-Z і kill -STOP?


14

Коли я запускаю команду ( 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запускається рекурсивно. Насправді, я думаю, це йде на кілька рівнів глибше.
Таймон

Відповіді:


12

Чим Ctrl-Z відрізняється від того kill -STOP, і як я можу отримати поведінку колишнього в сценарії оболонки?

CTRL-Zзазвичай надсилає SIGTSTP (який може бути заблокований), і - крім інших речей - оболонки часто скидають tty до раніше збереженого стану. Більш важливо, однак, що група процесів керуючого терміналу встановлюється в PID оболонки (а потім знову в PID завдання, відновленого з fg).

Поверніться до своєї первісної проблеми: використання частотного масштабування, наприклад, Cpufreqd, може бути кращим молотком для вашого нігтя.


4

Ви не хочете зупиняти makeпроцес; ви хочете зупинити makeпроцес і всі його дочірні процеси. Маю намір зробити, що рециркуляція виконувалася.

Ви можете спробувати set -m, а потім використовувати %1замість "$subpid".

set -mДозволяє «контролювати роботу», яка за замовчуванням відключена скриптів всередині. Я думаю, що це має спрацювати з вашим випадком використання, хоча люди, здається, взагалі вважають це поганою ідеєю .


4

Ви можете надіслати сигнал усім процесам у групі процесів, якщо вказати негативне значення PID - PGID лідера сеансу.

kill -STOP -"$subpid"

Примітка. Для запуску програми в новому сеансі використання setsid make. Але у вашому випадку я думаю, що це не потрібно. Однак, якщо make запускається рекурсивно, кожен екземпляр make може бути власним лідером (я не впевнений у цьому).

Іншим варіантом може бути використання killall:

killall -STOP make

Різниця між Ctrl + Z і kill -STOP:

  • Ctrl-Z фактично надсилає TSTP, який може бути заблокований.
  • STOP не можна заблокувати.

PGID підхід не зробив роботу, і підготував наступний рядок виводу: /usr/local/bin/myscript: line 38: kill: (-10202) - No such process. Фонові процеси продовжували працювати. Я не думаю, що цей killallпідхід спрацює, тому що деякі підпроцеси здаються, shа не make.
Таймон

Здається, процес, на який ви надсилаєте сигнал, вже завершився. Підпроцеси з іменем sh породжуються make. У вашому випадку виготовлення та багатьох підпроцесів найкращим було б, мабуть, отримати PID-адреси всіх дітей та зупинити їх усіх.
Юрій

Це закінчилося, коли я робив це вручну з оболонки, але не в сценарії оболонки. Я думаю, це тому, що коли я це робив вручну, кореневий PID (від якого успадкували інші PGID) був першою makeкомандою, але коли я це робив із сценарію, кореневий PID був із самого сценарію оболонки .
Таймон

1

Ctrl+ Cвикористовується для вбивства процесу із сигналом SIGINT, іншими словами - це ввічливе вбивство .

Ctrl+ Z використовується для призупинення процесу, надсилаючи йому сигнал SIGSTP , який нагадує сигнал сну, який можна відмінити, і процес можна відновити знову.

Однак, коли процес призупинено, ми можемо відновити його заново fg (відновити на передньому плані) та bg (відновити у фоновому режимі) , але я не можу відновити вбитий процес, тобто різниця між використанням Ctrl+ C& Ctrl+ Z.

Як переглянути призупинений процес?

Якщо у вас є кілька призупинених команд, щоб їх jobsвключити до списку, ви використовуєте команду, і вихід буде:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

Як вбити призупинений процес у фоновому режимі?

За допомогою killкоманди:

kill %nде n - номер завдання (той, який знаходиться в квадратних дужках з виводу завдань), тому я хочу вбити cat : kill %1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.