• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Prozesse beenden mit Shellskript

Kann mir jemand sagen warum der zweite Teil dieses Skripts nicht funktioniert, und mir ggf. einen Lösungsvorschlag machen?

Code:
#!bin//sh
#Fragt nach der PID des Prozesses und beendet diesen \ 
#mit dem TERM Signal
#Falls der Prozedur ein Argument übergeben wurde, werden vorher #alle laufenden Prozesse angezeigt, \
#deren Kommando bzw. Name mit dem Argument übereinstimmt
#Die Prozedur versucht den Prozeß sanft zu beenden, sollte er #nach fünf Sekunden immernoch laufen, wird er \
#zum Beenden gezwungen (kill -9 (SIGKILL)).

if [ $# = 1 ]; then
   #sucht in der Przessliste nach Prozess mit Namen $1
   ps -C $1
fi
   read -p "Bitte geben Sie die PID des Prozesses: " pid
   kill -15 $pid

   sleep 5;

#test -n = Länge von $pid ungleich Null - wenn nein, wid Prozess
mit SIGKILL beendet
if [ -n `ps $pid` ]; then
   kill -9 $pid
fi

Danke!
 

TeXpert

Guru
hast Du Dir die Ausgabe von ps $pid mal angesehen?

Code:
$ ps 7397
  PID TTY      STAT   TIME COMMAND
 7397 pts/2    Ss     0:00 /bin/bash
d.h. Du musst erst mal sicherstellen, dass Du nicht die 1. Zeile berücksichts insbesondere wenn pid nicht existiert:
Code:
$ ps 1111
  PID TTY      STAT   TIME COMMAND
dazu würde ich das so machen:

Code:
ps $pid | awk "/$pid/ { print ; }"

zusätzlich erwartet -n einen String, also noch "" drumrum und den AWK-Code escapen:
Code:
if [ -n "`ps $pid | awk \"/$pid/ { print ; }\"`" ]; then
   kill -9 $pid
fi
 
OP
hagbard-celine
Kannst du mir noch erklären warum $pid von / umschlossen ist,
hinter print ein Semikolon steht und die inneren Hochkommata maskiert sind?
Habe mit awk noch nicht gearbeitet - scheint aber ein mächtiges Kommando zu sein :-/

Thank you!
 

TeXpert

Guru
schau Dir die awk-Syntax an ;) einmal: bei einem 2. Gedanken: Du kannst das { print ; } auch komplett weglassen das ist der Default.

; beendet eine Operation, das ist bei nur einer Operation gar nicht nötig.

dann sit die Struktur immer
Code:
pattern { action }
dieses Pattern kann eine Regular expression sein -> /expr/ daher die / /.

bei den beiden geschützten Hochkommata, das könnte sein, dass das innerhalb der Backticks unnötig ist, da bin ich aber nicht sicher ;) bei Bash quote ich lieber einmal mehr als zu wenig
 
Oben