Hur fungerar Ctrl + Z med kommandoraden inte med tangentbordet? [stängd]
On februari 10, 2021 by adminKommentarer
- Du frågade detta tidigare på unix.stackexchange.com/questions/386200 , och med denna duplikat har du faktiskt inte klargjort de saker som människor har bett att göras tydliga.
- Inte en riktig duplikat. Den här frågan handlar om Ctrl-Z, den andra handlar om Ctrl-S, men svaret är faktiskt detsamma.
- Nej, den andra är inte om Ctrl + S. Åtminstone så mycket anges i frågan.
Svar
Control + Z skriver kontrolltecknet susp
, som skickar signalen SIGTSTP
(nummer 20 på Linux amd64, 24 på Solaris amd64, 18 på FreeBSD amd64 … det är bättre att undvika att hänvisa till signaler efter nummer som att de inte är bärbara) till alla processer i terminalens förgrundsprocessgrupp.
Du kan skicka en signal för att stoppa en process från kommandoraden med kill
-kommandot.
kill -s STOP <pid>
(där <pid>
är id för processen du vill avbryta) eller, om du vill adressera alla processer i ett program med ett visst namn (tekniskt sett alla processer vars namn matchar ett givet utökat reguljärt uttryck):
pkill -STOP xterm
(där xterm
är ett exempelnamn).
Skicka tecken när du behöver återuppta processerna al SIGCONT
på samma sätt.
Kommentarer
- Det skickar SIGTSTP (20 på Linux på amd64 åtminstone) signal, inte SIGSTOP, och till förgrundsprocessen grupp av terminalenheten. SIGTSTP kan hanteras, inte SIGSTOP.
- men hur man vet hur många sessioner terminalen kör
- Vad betyder
pid
? - @abuali " PID " är förkortning för " process-ID ". Se en.wikipedia.org/wiki/Process_identifier
- @ St é phane Chazelas hur konw
process ID
special i terminalen öppnad
Svar
Om du vill stoppa alla processer som har /dev/pts/12
som sin kontrollterminal (inklusive alla förgrunds- och bakgrundsjobb som körs i terminalen och skalet) kan du göra:
pkill -STOP -t pts/12
Det skulle också avbryta sessionens ledare. I vissa fall kan den återupptas automatiskt. Till exempel återupptar GNU screen
sessionledaren så snart den upptäcker att den har stängts av.
Om du vill skicka SIGTSTP-signalen till förgrundsprocessen grupp av den terminalen som ^Z
skulle du ”göra:
kill -s TSTP -- "-$pgid"
Var $pgid
är processgrupp-ID för den förgrundsprocessgruppen. På Linux och BSD: er i listan kan du ta reda på vilken det är genom att köra ps -o tpgid= -p "$pid"
där $pid
är id för alla processer som har terminalen som sin kontrollterminal. På de flesta system kan någon av dessa processer också ta reda på den med tcgetpgrp()
.
I båda fallen fortsätter du dessa processer genom att skicka SIGCONT-signalen i stället för SIGSTOP / SIGTSTP.
Svar
Skicka STOP
-signalen till de processer som du vill avbryta.
Du kan senare skicka signal för att avbryta en avstängd process.
Till exempel:
pkill -STOP terminal
Detta skulle avbryta alla terminal
processer.
pkill -CONT terminal
Detta skulle avbryta alla processer som heter terminal
.
Kommentarer
- men hur man vet hur många sessioner terminalen kör
- @abuali I ' jag är inte säker på vad du menar.
pkill
letar upp alla processer som matchar namnet som du tillhandahåller och skickar signalen till alla dessa. Om du vill begränsa till en viss användare lägger du till-u username
.
Lämna ett svar