Ik wil alle processen doden die ik doorkrijg:
ps aux | grep my_pattern
Hoe doe ik dat?
Dit werkt niet:
pkill my_pattern
Gebruik pkill -f
, dat overeenkomt met het patroon voor elk deel van de opdrachtregel
pkill -f my_pattern
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Wat's deze code aan het doen?
De ps -ef
produceert een lijst van proces id's op de computer zichtbaar voor deze gebruiker. De pipe grep
filtert dat naar rijen die die string bevatten. De grep -v grep
zegt niet overeen te komen met het proces zelf dat de grep doet. De pipe awk print zegt de rijen te splitsen op standaard witruimte en te filteren op de tweede kolom die ons proces id is. De pipe xargs start een nieuw proces om al die pid's naar kill -9
te sturen, om ze allemaal te beëindigen.
De bovenstaande code is slecht, gevaarlijk, lelijk en hackish om verschillende redenen.
Als de code die geforceerd wordt beëindigd database ops of beveiligde transacties doet met lage waarschijnlijkheid race conditions, zal een fractie van een procent van de tijd, atomiciteit van die transactie worden vernield, wat ongedefinieerd gedrag veroorzaakt. kill -9 neemt geen gevangenen. Als je code hier gevoelig voor is, probeer dan het xargs kill
gedeelte te vervangen door een verzonden vlag die een graceful shutdown aanvraagt, en alleen als dat verzoek geweigerd wordt, als laatste redmiddel kill -9
Er's een niet nul mogelijkheid dat je per ongeluk het besturingssysteem zal beëindigen of veroorzaakt ongedefinieerd gedrag in een niet-verwant proces, wat leidt tot hele systeem instabiliteit, omdat ps -ef
een lijst geeft van elk mogelijk proces dat zou kunnen bestaan, en je kunt's niet zeker zijn dat een of andere rare 3rd party bibliotheek je procesnaam deelt, of dat in de tijd tussen lezen en uitvoeren kill -9, de processid was veranderd in iets anders, en nu heb je's per ongeluk een of ander willekeurig proces beëindigd waar je niet's bedoeling mee had.
Maar, als je de risico's begrijpt en ze beheerst met zeer unieke namen, en je'bent oké met een paar mislukte transacties of incidentele corruptie in gegevens, dan komt het 99,9% van de tijd goed. Als er'een probleem is, herstart de computer, zorg ervoor dat er geen proces botsingen zijn. Het is door code als deze dat het tech support script: "Heeft u geprobeerd uw computer opnieuw op te starten" een niveau 5 meme wordt.
Als u meer flexibiliteit nodig hebt bij de keuze van de processen, gebruik dan
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
U kunt grep -e enz. gebruiken.