2016-06-03 12 views
0

Im Moment funktioniert mein Bash-Skript für 1 PID-Prozesse und ich muss einen genauen Prozessnamen für die Eingabe verwenden. Es akzeptiert keine *firefox*' for example. Also, I run a bash script that opens multiple rsync` Prozesse, und ich möchte, dass dieses Skript alle diese Prozesse abbricht. Aber dieses Skript funktioniert nur bei Prozessen mit 1 PID. HierBash-Skript löscht nicht alle PIDs in der angegebenen Datei oder erlaubt teilweise Namen für die Eingabe

ist das Skript:

#!/bin/bash 

    createProcfile() { 

    ps -eLf | grep -f process.tmp | grep -v 'grep' | awk '{print $2,$10}' | sort -u | egrep -o '[0-9]{4,}' > pid.tmp 

# pgrep "$(cat process.tmp)" > pid.tmp 

    } 

    PIDFile=pid.tmp 

    echo "Enter a process name" 
    read -r process 
    echo "$process" > process.tmp 

# node_process_id=$(pidof "$process") 
    node_process_id=$(ps -eLf | grep $process | grep -v 'grep' | awk '{print $2,$10}' | sort -u | egrep -o '[0-9]{4,}') 
    if [[ -z "$node_process_id" ]]; then 
      echo "Please enter a valid process." 
     rm process.tmp 
     exit 0 
    fi 

    ps -eLf | grep $process | awk '{print $2,$10}' | sort -u | grep -v 'grep' 
# pgrep "$(cat process.tmp)" 

    echo "Would you like to kill this process(es)? (y/n)" 
    read -r answer 

    if [[ "$answer" == y ]]; then 

     createProcfile 
     pkill -F "$PIDFile" 
     rm "$PIDFile" 
     sleep 1 
     createProcfile 

     node_process_id=$(pidof "$process") 
     if [[ -z $node_process_id ]]; then 
       echo "Process terminated successfully." 
      rm process.tmp 
      exit 0 
     else 
      echo "Process not terminated. Kill process manually." 
      ps -eLf | grep $process | awk '{print $2,$10}' | sort -u | grep -v 'grep' 
#   pgrep "$(cat process.tmp)" 
      rm "$PIDFile" 
      rm process.tmp 
      exit 0 
     fi 
    fi 

ich das Drehbuch bearbeitet. Dank Ihre Kommentare, es funktioniert jetzt und macht folgende:

  1. Make Skript akzeptiert Teilnamen als Eingabe
  2. töten mehr als 1 PID

Thank you!

+0

Warum nicht einfach 'pkill' verwenden? – iruvar

+0

Ja! @iruvar Danke! Bitte beantworte die Frage, damit ich dir Punkte geben kann. – Debug255

Antwort

0
It will not accept *firefox* 

Verwenden Sie den Befehl killall. Beispiel:

killall -r "process.*" 

Dies wird töten alle Prozesse, deren Namen Prozess am Anfang, gefolgt von jede Sachen.

The [ manual ] sagt:

-r, --regexp
Prozess Namensmuster als erweiterter regulärer Ausdruck Interpretieren.

Nebenbei bemerkt:

Bitte beachte, dass wir zitieren den regulären Ausdruck zu verdoppeln haben Datei Globbing zu verhindern.
(Danke @broslow für die Erinnerung an diese Sachen).

+0

Immer noch sollte zitiert werden oder – BroSlow

+0

Ich glaube, es muss nicht sein. – sjsam

+1

'killall' wird nie' * 'sehen, wenn es eine Datei gibt, die zu' process. * 'In Ihrem aktuellen Verzeichnis passt – BroSlow

0

pkill existiert, um Ihr Problem zu lösen. Es akzeptiert ein Muster, das mit dem Prozessnamen oder der gesamten Befehlszeile übereinstimmt, wenn -f angegeben ist.

+0

Der Teil des Skripts, den ich einen Teilnamen akzeptieren muss, sollte den Prozess auch nicht beenden. Also kann ich das nicht benutzen. Ich habe mein Skript bearbeitet, um Ihnen zu zeigen, was ich getan habe, um es zu reparieren oder um es als 'Umgehung' zu verwenden. – Debug255