So töten Sie eine PID basierend auf dem Ergebnis einer if-Anweisung

422
FabioEnne

Ich versuche, ein Programm neu zu starten, wenn ihm nur eine PID zugeordnet ist (es müssen zwei PIDs vorhanden sein). Wenn es mehr als eine hat, ist es in Ordnung, ich habe versucht, ein bash-Skript zu schreiben, aber ich bemühe mich, dass es richtig funktioniert. Dies ist mein Code, also kann mir jemand helfen, mein Ziel zu erreichen?

#! /bib/bash pgrepRes=($(pgrep deluge)) if ["${#pgrepRes[@]}" -ne "2"]; then kill $; fi deluge 

aber ich bekomme dieses Ergebnis:

Wie Sie sehen, habe ich geprüft, wie viele PIDs mit der Sintflut verbunden sind.

Vielen Dank im Voraus, ich hoffe, ich habe mich klar genug erklärt, ansonsten bitte fragen :)

0
Versuchen Sie `$ (pgrep deluge | wc -l)`. Es sollte Ihnen die Anzahl der Zeilen und die "pkill-Sintflut" in der if-Anweisung angeben. Fügen Sie ein Leerzeichen `[was auch immer]` hinzu. Niemals [ohne Räume] Hastur vor 8 Jahren 0
@Hastur Kannst du meinen Code bitte mit einer Antwort ändern? Vielen Dank FabioEnne vor 8 Jahren 0
Wenn etwas nicht funktioniert, teilen Sie es in seine Bestandteile auf. Ihr Problem ist das Fehlen von Leerzeichen um `[` und `]`. Es hat nichts mit dem Aufruf von "kill" zu tun. a CVn vor 8 Jahren 0
Ich nehme an, es entspricht nicht Ihrem Zweck, auch nicht der "-ne 2". Sie sollten `-lt 2` _wenn nicht _ und nicht _not equal_ '-ne` verwenden. Sie sollten sich als nützlich erweisen, _ einige Anregungen zu machen;) _ aus dem [Bash Beginners Guide] (http://tldp.org/LDP /Bash-Beginners-Guide/html/sect_07_01.html). Hastur vor 8 Jahren 0

1 Antwort auf die Frage

0
Hastur

Es gibt einige Druckfehler. Versuchen Sie so etwas

#!/bin/bash pgrepN=$( pgrep deluge | wc -l ) if [ "$pgrepN" -lt "2" ]; then echo "less then 2" # pkill deluge echo here restart deluge # restart only if there were less than 2 fi 

Beachten Sie, dass Sie im Shebang (erste Zeile) kein Leerzeichen zwischen #!den Pfad der Shell und den Pfad der Shell setzen dürfen. Mit dem Testoperator müssen []Sie Leerzeichen in die Klammern setzen. Dies ist beispielsweise [ OK ] in [NOT OK].
Wenn ich Ihren Zweck richtig verstanden habe, möchten Sie nur dann einen Neustart durchführen, wenn es weniger als zwei Vorkommen gibt, also in der IF-Anweisung.


Update :

#!/bin/bash Time_to_Sleep="5m" # Put here the amount of time DKiller="/tmp/Kill_Deluge_Script.sh" # Put here the deluge killer script Name  echo "#!/bin/bash" > $DKiller # Creating script that will kill this one echo "kill $$; sleep 3s; " >> $DKiller # Passing the command to kill this one echo "pkill deluge" >> $DKiller # Now you can kill deluge too echo "echo deluge killed... RIP " >> $DKiller chmod u+x $DKiller # Make the script executable for you  while true  do pgrepN=$( pgrep deluge | wc -l ) if [ "$pgrepN" -lt "2" ]; then echo "less then 2" # pkill deluge echo here restart deluge # restart only if there were less than 2 fi sleep $Time_to_Sleep done 
Es hat wie ein Zauber funktioniert! Danke vielmals! Meine nächste Aufgabe ist es nun, es an einen Cron-Job anzuschließen, der alle 5 Minuten ausgeführt wird! FabioEnne vor 8 Jahren 0
Ich habe das Skript in einer .sh-Datei gespeichert und die Crontab (über crontab-e) bearbeitet und alle 5 Minuten ausgeführt. Ich erteile auch die Erlaubnis, dass chmod 775 ausgeführt wird, aber es scheint nicht so zu funktionieren. Wenn ich das Skript direkt in die Shell kopiere, funktioniert es einwandfrei. Ich weiß, dass Crontab ordnungsgemäß ausgeführt wird ... eine Idee? FabioEnne vor 8 Jahren 0
Ich nehme an, Sie müssen nicht jedes Mal über die Flut laufen, aber wenn Sie einmal gelaufen sind, möchten Sie, dass es nicht mehr möglich ist, den _crontab_ nicht zu berühren und das obige Skript in eine endlose Schleife mit einem "sleep 5m" zu integrieren innerhalb der Schleife und mit einem `echo" kill $$> /tmp/Kill_Deluge_Script.sh "` und `echo" pkill deluge ">> / tmp / Kill_Deluge_Script.sh` vor der Schleife selbst, so dass Sie die Sintflut töten können ... Hastur vor 8 Jahren 0
Ich kann herausfinden, wie Sie das, was Sie geschrieben haben, implementieren kann. Können Sie mir beim Bearbeiten des obigen Codes helfen? FabioEnne vor 8 Jahren 0
@FabioEnne Du solltest versuchen zu sagen, wo du aufhörst. Übrigens, mache vor und nach dem Versuch, ob es funktioniert (habe ich nicht gemacht). Hastur vor 8 Jahren 0