Kiedy uruchamiam polecenie ( make
w dużym projekcie) z powłoki, mogę wpisać Ctrl-Z, aby zatrzymać proces i powrócić do powłoki. Następnie mogę uruchomić, fg
aby kontynuować proces.
Próbuję napisać skrypt powłoki, aby to zautomatyzować (w szczególności, aby sprawdzać temperaturę mojego procesora co kilka sekund i zatrzymać proces, jeśli robi się zbyt gorąco, ponieważ mój komputer jest podatny na przegrzanie). Moja pierwsza próba działała w ten sposób (uproszczona):
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"
Niestety to nie zadziałało; wysłanie SIGSTOP do procesu nie wstrzymało go (co widać po dalszym wysyłaniu danych wyjściowych do terminala). Uruchomiłem make &
z linii poleceń, wysłałem SIGSTOP i sprawdziłem status procesu za pomocą ps
; został wymieniony jako zatrzymany (i zaczął się ponownie, gdy wysłałem SIGCONT), ale nadal wyrzucał moc wyjściową i zwiększał moją temperaturę rdzenia! Zatrzymanie go za pomocą Ctrl-Z nigdy nie miało tego problemu, ale nie wiem, jak to zrobić w skrypcie.
Czym różni się Ctrl-Z kill -STOP
i jak mogę uzyskać zachowanie tego pierwszego w skrypcie powłoki?
źródło
make
jest uruchamiany rekurencyjnie. W rzeczywistości myślę, że ma kilka poziomów głębokości.Odpowiedzi:
CTRL-Z
zwykle wysyła SIGTSTP (który może być zablokowany) i - poza innymi rzeczami - powłoki często resetują tty do wcześniej zapisanego stanu przy takich okazjach. Co ważniejsze jednak, sterująca grupa procesów terminalowych jest ustawiona na PID powłoki (a następnie ponownie na PID zadania wznowionegofg
).Powrót do pierwotnego problemu: zastosowanie skalowania częstotliwości zależnego od temperatury, takiego jak np. Cpufreqd, może być lepszym młotkiem do paznokci.
źródło
Nie chcesz zatrzymać tego
make
procesu; chcesz zatrzymaćmake
proces i wszystkie jego procesy potomne. Założę się, że make był uruchamiany rekurencyjnie.Możesz spróbować
set -m
, a następnie użyć%1
zamiast"$subpid"
.set -m
Umożliwia „kontrolę pracy”, który jest domyślnie wyłączony skryptów wewnątrz. Myślę, że to powinno działać w twoim przypadku użycia, chociaż ludzie wydają się sądzić, że to zły pomysł w ogóle .źródło
Możesz wysłać sygnał do wszystkich procesów w grupie procesów, jeśli podasz ujemną wartość PID - PGID lidera sesji.
Uwaga: Aby uruchomić program w nowej sesji, użyj
setsid make
. Ale w twoim przypadku myślę, że nie jest to potrzebne. Jeśli jednak make jest uruchamiane rekurencyjnie, każda instancja make może być własnym liderem (nie jestem tego pewien).Inną opcją może być użycie
killall
:Różnica między Ctrl + Z a kill -STOP:
źródło
/usr/local/bin/myscript: line 38: kill: (-10202) - No such process
. Procesy w tle nadal działały. Nie sądzę, aby tokillall
podejście działało, ponieważ niektóre podprocesy wydają sięsh
raczej byćmake
.make
polecenia, ale kiedy zrobiłem to ze skryptu, główny identyfikator PID pochodził z samego skryptu powłoki .Ctrl+ Csłuży do zabicia procesu sygnałem
SIGINT
, innymi słowy jest to grzeczne zabicie .Ctrl+ Z służy do zawieszenia procesu poprzez wysłanie mu sygnału SIGSTP , który jest jak sygnał uśpienia, który można cofnąć i proces można wznowić ponownie.
Jednak gdy proces zostanie zawieszony, możemy go wznowić do
fg
(wznowienie na pierwszym planie) ibg
(wznowienie w tle) , ale nie mogę wznowić zabitego procesu, to jest różnica między używaniem Ctrl+ Ci Ctrl+ Z.Jak wyświetlić zawieszony proces?
Jeśli masz wiele zawieszonych poleceń, aby je wyświetlić, użyj
jobs
polecenia, a wynikiem będzie:Jak zabić zawieszony proces w tle?
Za pomocą
kill
polecenia:kill %n
gdzie n to numer zadania (ten w nawiasach kwadratowych z danych wyjściowych zadań), więc chcę zabić kota:kill %1
.źródło