Puncte:0

Cum să omorâți 3 procese cu nume total diferite?

drapel in

Vreau să omor 3 procese cu nume diferite, nimic în comun. Cum pot face acest lucru? grep nu le poate captura pe toate pentru că nu există nimic în comun sau există o modalitate de a le face să le captureze pe toate?

Nmath avatar
drapel ng
Este greu să răspunzi la o întrebare fără detalii. Pentru început, ne puteți spune procesele și de ce nu puteți rula doar trei comenzi.
guiverc avatar
drapel cn
Kill vă permite să specificați mai multe PID-uri; vezi `man kill` pentru pagina manualului de referință.
Quasímodo avatar
drapel jp
-1 Chiar nu înțeleg asta. Chiar dacă fiecare comandă care poate ucide ar putea ucide doar un singur proces, tot ce ar trebui să faci este să emiti comanda de trei ori, nu?
Puncte:8
drapel fr

Un exemplu pentru ucidere discuri-gnome și gnome-sistem-monitor.

kill $(pidof gnome-disks gnome-system-monitor)

Sunt sigur că avem asta pe aici deja într-o anumită formă, pentru că cineva de aici trebuie să fi spus așa ceva în urmă cu ani.

L-ai putea face mai frumos, dar mai complicat astfel:

# Furnizați o listă separată de spații albe cu numele programelor de eliminat
programs_to_kill="gnome-disks gnome-system-monitor"
ucide $(pidof $programs_to_kill)
melvio avatar
drapel cn
Votat favorabil. @dawnslayer Vă propun să marcați acest lucru ca răspuns acceptat. Această soluție va fi cea mai bună abordare pentru majoritatea oamenilor.
Puncte:4
drapel cn

Dacă vrei cu adevărat să folosești grepping, poți să folosești pkill pentru a obține codurile de proces (pid-uri). pkill greps pentru unele modele în procesul numește și ucide procesele găsite.

Sintaxa pe care o puteți folosi este:

pkill 'nume_proces1|altul_proces|altceva'

Poți să folosești pgrep (procesează grep) pentru a verifica cu ce urmează să omori pkill.
Sintaxa este foarte asemănătoare:

pgrep -l 'nume_proces1|altul_proces|altceva'

De exemplu, dacă rulez următoarea comandă pe mașina mea, primesc o listă de potriviri cu acestea pids:

$ pgrep -l 'clamd|dockerd|snapd'
1952 snapd
1989 clamd
2085 dockerd
2813 dockerd

Avertizare: Dacă știți de fapt numele complete ale procesului, vă rugăm să utilizați LiveWireBTraspunsul lui:

kill $(pidof process_name1 other_proces)

Astfel, ssh-agent și sshd nu vei fi victima când vei fugi pkill ssh și nu a fost atent la ce pgrep -l ssh spus.

melvio avatar
drapel cn
Rețineți că eu personal aș folosi răspunsul @LiveWireBT. Grepping poate fi dificil și s-ar putea să ucizi prea puține procese, sau chiar mai rău, prea multe. Cu toate acestea, deoarece ați menționat grep, am adăugat acest răspuns pentru a vă oferi funcționalitatea.
Peter Cordes avatar
drapel fr
Puteți ancora modelele cu `^foo$|^bar$` sau ceva care să le forțeze să se potrivească cu numele complet al procesului, în loc de doar subșiruri care s-ar putea potrivi cu ușurință prea mult? Sau opțiunea pkill/pgrep pentru a solicita potriviri cu șir complet precum `grep -x`?
melvio avatar
drapel cn
Comentariul @PeterCordes arată exact problema cu grep; este mai riscant decât este necesar dacă știi deja numele complete. Dacă știți numele complete ale procesului de ucis, nici măcar nu m-aș deranja cu `-x` sau `^process-name$`. Aș folosi soluția @LiveWireBT în schimb. Utilizați acest lucru numai dacă doriți să combinați funcționalitatea `grep`+`kill`.
Peter Cordes avatar
drapel fr
Sigur, dar dacă vrei să postezi despre grep, poți fi specific despre riscurile și ce îl face mai puțin convenabil să folosești în siguranță.
melvio avatar
drapel cn
Sunt de acord cu @PeterCordes. Am adăugat o notă de **avertisment**. De asemenea, sunt bucuros să accept modificări suplimentare care explică compromisurile/riscurile/avertismentele.
Puncte:2
drapel my
Killall name1 && Killall name2 && Killall nume3
LiveWireBT avatar
drapel fr
Anecdotă: Într-o slujbă de acum câțiva ani a trebuit să monitorizăm aplicațiile java și să le repornim dacă era necesar. Așa că am folosit `killall` pentru a ucide procesele, ceea ce a fost bine. Le-am repornit ca în documentația pe care o aveam. Totul bine. Până a doua zi (sau încă câteva zile) când suportul de nivel al doilea a întrebat cum am ucis procesele, pentru că aplicația java care ar trebui să monitorizeze procesele a „murit” și nu a mai revenit. Cu toate acestea, această aplicație nu a fost în documentația noastră. Genul de lucruri stupide pe care le fac oamenii. :-) (Înțelegerea slabă a platformei aplicației, documentație slabă.)
LiveWireBT avatar
drapel fr
Bună, nou colaborator. Vă rugăm să furnizați un răspuns complet. Poate fi interesant de ce alegeți să anulați dacă prima comandă kill nu are succes, ceea ce face înlănțuirea comenzilor împreună cu `&&` în bash.
bac0n avatar
drapel cn
`killall name1 name2 name3` va face.
Puncte:-1
drapel us

Presupunând că puteți selecta cele trei procese după nume, atunci soluția mea ar fi:

ucide `ps awx| grep -E '((ProcessNameA)|(ProcessNameB)|(ProcessNameC))' |grep -v grep| sed "s/ .*$//"`
LiveWireBT avatar
drapel fr
A well known hack to avoid `grep 'pattern' | grep -v grep` is to use `grep '[p]attern'`. :-)
LiveWireBT avatar
drapel fr
It probably gets the job done, but you should study more manpages of the tools available. I built similar things years ago which coworkers were afraid to touch. I know when I mangle too much through grep and sed, then I should take a look at awk or rethink the whole thing. shellcheck is a useful tool. Googles Shell Style Guide is also worth a read.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.