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

Programme killen - wie ist der Befehl?

HaukeW

Member
Hallo!
Wie hier erläutert, beenden sich Programme bei mir nicht immer richtig. Extrem wird es bei dem Spiel World of Warcraft, was sich gar nicht beendet, sondern, wenn ich auf "Beenden" klicke, einfach einfriert. Das scheint aber ein Fehler im Spiel zu sein. Das Blöde ist nur, dass wenn das Spiel einfriert, ich es mit STRG-ALT-ESC beenden muss, dabei durch die Liste scrollen muss, weil ich es nur unter 800x600 spielen kann - und dann mit 2-3 Mal STRG-ALT-"-" die Auflösung des virtuellen Desktops wieder auf 1280 schalten muss.

Der Grund für diesen Thread, ist die Frage, ob man ein Script schreiben kann, dass die Auflösung wieder auf 1280 setzt, und das das Programm killt.

Gruß, Hauke
 
OP
H

HaukeW

Member
ok, ich bin einen Schritt weiter, ich kann mit ALT-F2 Projekt-ids killen. (kill 7624 z.B. )
Wie finde ich raus, welche Projekt-id ein bestimmtes Programm hat? (z.B. wine)
Einfach "kill wine" schreiben geht nicht...

Gruß, Hauke
 

admine

Ultimate Guru
HaukeW schrieb:
ok, ich bin einen Schritt weiter, ich kann mit ALT-F2 Projekt-ids killen. (kill 7624 z.B. )
Wie finde ich raus, welche Projekt-id ein bestimmtes Programm hat? (z.B. wine)
Einfach "kill wine" schreiben geht nicht...

Das ist keine Projekt-ID sondern die Prozess-ID ;)
und du findest sie raus mit
Code:
ps -ef | grep wine
 

oc2pus

Ultimate Guru
vielleicht schaust du dir mal das Programm htop an. Es ist ein kleines Tool für die Konsole mit dem kannst du auch deine Programme abschiessen ;)

http://htop.sourceforge.net/

gibt es auch als RPM hier:
http://ftp4.gwdg.de/pub/linux/suse/apt/SuSE/9.1-i386/RPMS.suser-oc2pus/
http://ftp4.gwdg.de/pub/linux/suse/apt/SuSE/9.2-i386/RPMS.suser-oc2pus/
http://ftp4.gwdg.de/pub/linux/suse/apt/SuSE/9.3-i386/RPMS.suser-oc2pus/
 

taki

Advanced Hacker
Auch sehr nett, um lästige Programme loßzuwerden:


killall -SIGNAL befehl

Gerade bei wine ganz hilfreich.

Code:
killall -KILL wine-server

Sowas mach ich in der Konsole. Dann sieht man auch gleich warum es nicht klappt, wenn es nicht klappt ;-)

Wenn ich nicht genau weiß, wie der Prozess genau heißt, bemühe ich vorher

ps aux |grep suchbegriff

also z.B.

Code:
ps aux |grep wine
 
OP
H

HaukeW

Member
Danke für die Antworten, der Befehl
Code:
killall -KILL wine
klappt großartig. Aber wie kriege ich es hin, mit einem Befehl die Auflösung des virtuellen Desktops von 800x600 wieder auf 1280x960(1024?) zu stellen, ohne 3x STRG-ALT-"-" zu drücken?
 

TomcatMJ

Guru
Hi!
Mit
Code:
kill -l
kriegt man die Liste der zulässigen Signale die man per kill-Befehl an einen Prozess geben kann, wahlweise als Nummer oder Begriff,woraus resultiert, daß
Code:
kill -9 <ProzessID>
dasselbe ist wie
Code:
kill -SIGKILL <ProzessID>
.Sauberer ist jedoch statt dem SIGKILL ein SIGTERM (15) an den Prozess zu schicken sofern er darauf reagiert und nicht schon halb erschossen im System rumlauert, da der Prozess so noch die Gelegenheit bekommt eventuell zu speichernde Dinge vor dem Beenden sauber zu speichern, wohingegen ein SIGKILL den Prozess sofort beendet egal was er gerade noch tut.

Bis denne,
Tom
 

taki

Advanced Hacker
killall kennt -KILL (u.a.) als benanntes Signal. kill kennt -SIGKILL (u.a.).

Großschreibung beachten, ein -kill kennt kein von mir bekanntes Tool.

SIGTERM (15) ist voreinstellung. Wenn bei kill oder killall gar kein Signal angegeben wird, schickt es immer SIGTERM.

SIGKILL ist Signal 9 und war bei meinen Experimenten mit störrischen Wine-Prozessen immer das Einzige, was half. Ist aber schon sehr lange her, dass ich mal mit wine gefummelt habe, bisher hab ich noch für jedes Programm ein mindestens ebenbürtiges Linuxprogramm gefunden, und wenn nicht, dann war das Programm doch nicht wirklich wichtig.
 

TomcatMJ

Guru
Taki: Jepp, nur betrifft killall eben alle Prozesse die denselben Namen haben, kill hingegen nur einen mit der entsprechenden ProzessID, manchmal ist dies ein sehr relevanter Unterschied ,z.B. wenn man nur einen bestimmten Konqueror-Prozess abwürgen will ohne direkt alle zu erschiessen, oder wenn man aus versehen ein Programm 10 mal gestartet hat und diese alle auf einmal beenden will ohne sich 10 ProzessIDs rauszufischen...
Das ist eben typisch Linux/Unix, mehrere Lösungen für artverwandte Probleme die aber in feinheiten exakt auf ein Problem zugeschnitten sind, auch wenn sie grob gesehen auf mehrere Probleme die Antwort darstellen können....;)
(siehe auch Xine vs. MPlayer vs. Ogle, Apache vs. Roxen vs. Zeus vs. sonstige HTTP-Server...)
Bis denne,
Tom
 

oc2pus

Ultimate Guru
na dann pack ich auch noch einen rein ;)

wer viele Java-Programme laufen hat und eines davon killen will, kann dieses Script nuzen um die PID zu ermitteln:
Code:
#!/bin/bash
#
# Copyright (c) 2000 Alexander V. Konstantinou <akonstan@acm.org>
#
# Permission to use, copy, modify, distribute and sell this software
# and its documentation for any purpose is hereby granted without fee,
# provided that the above copyright notice appear in all copies and
# that both that copyright notice and this permission notice appear
# in supporting documentation.  Alexander V. Konstantinou makes no
# representations about the suitability of this software for any
# purpose.  It is provided "as is" without express or implied warranty.
# 
# Description: prints out the java processes running on a Linux host.
#              Optional "-noflags" argument controls verbosity
#
# Requirements: Linux host with a /proc filesystem
#
# Updates: http://www.cs.columbia.edu/~akonstan/javaps
#
# $Id: javaps,v 1.3 2002/01/21 02:32:12 akonstan Exp $

PATH=/bin:/usr/bin

SYSNAME=`uname -s`

if [ "$SYSNAME" != "Linux" ]; then
  echo "$0: must be executed on Linux system (found $SYSNAME)" >&2
  exit 1
fi

if [ ! -d "/proc" ]; then
  echo "$0: Linux host does not appear to have a /proc filesystem" >&2
  exit 1
fi

NOFLAGS=0
if [ -n "$1" ]; then
  if [ "$1" = "-noflags" ]; then
    NOFLAGS=1
  else
    echo "Usage: $0 { -noflags }" >&2
    exit 1
  fi
fi

echo "PID	Process"

# For every file in the /proc file system

FILES=`/bin/ls -1 /proc`

for FILE in $FILES; do
  PROCESS_ID=$FILE
  STATUS_FILE=/proc/$FILE/status
  CMDLINE_FILE=/proc/$FILE/cmdline

  # Check if it is a process directory and that we have read access
  if [ -d "/proc/$FILE" -a -r $STATUS_FILE -a -r $CMDLINE_FILE -a "$FILE" != "/proc/self" ]; then
    
    PROCESS_NAME=`grep 'Name:' $STATUS_FILE | awk '{print $2}'`

    # Only interested in java processes
    if [ "$PROCESS_NAME" = "java" ]; then
      PARENT_PID=`grep 'PPid' $STATUS_FILE | awk '{print $2}'`

      # Figure out if process has a parent that is a java process
      ISROOT=0
      if [ $PARENT_PID -eq 1 ]; then
        ISROOT=1
      else
        PARENT_NAME=`grep 'Name:' /proc/$PARENT_PID/status | awk '{print $2}'`
        if [ "$PARENT_NAME" != "java" ]; then
          ISROOT=1
        fi
      fi

      # If root java process print out
      if [ $ISROOT -ne 0 ]; then
        PROCESS_CMDLINE="`cat $CMDLINE_FILE | tr '\000' ' '`"

        IGNORE_ARG=0
        DESCR=
        for ARG in $PROCESS_CMDLINE; do
          if [ $NOFLAGS -eq 0 ]; then
             DESCR="$DESCR $ARG"
          else
            if [ $IGNORE_ARG -eq 0 ]; then
              if [ $ARG = "-classpath" -o $ARG = "-cp" ]; then
                IGNORE_ARG=1
              elif [ -z "`echo $ARG | grep '^-D'`" -a -z "`echo $ARG | grep '^-X'`" ]; then
                DESCR="$DESCR $ARG"
              fi
            else 
             IGNORE_ARG=0
            fi
          fi
        done
        echo "$PROCESS_ID	$DESCR"
      fi
    fi
  fi
done

Aufruf:
javaps { -noflag }
* -noflag : filters out the Java flags -D, -X, -classpath, -cp
 

spunti

Hacker
gut, ich gebe hiermit offiziell zu, daß -KILL beim befehl kill geht. ist anscheinend keine parameter, sondern ein signal.

so, aber bei killall bestreite ich das weiterhin. laut meiner manpage kann man da nicht signale über geben ohne -s vorher, oder?

spunti
mir gehts wie immer ums prinzip:)
 

taki

Advanced Hacker
Nun denn zum Prinzip

killall -KILL ist das gleiche wie killall -s 9. Ging bei mir immer, als ich noch mit wine rumspielte. Damals hatte ich allerdings noch SuSE 9.1, nicht 9.3. Möglicherweise geht das nicht mehr. Möglicherweise war das auch nicht POSIX-Konform.

Schade, hier im Büro kann ich nicht nachschauen, weil das killall auf der Solaris sich wiederum völlig anders verhält als zuhause. Beim Solaris-killall kann man gar keinen Prozess angeben, weder per Namen noch per ID. Es wird zum Beenden gnadenlos aller Prozesse beim Herunterfahren verwendet.
 

TomcatMJ

Guru
Zitat aus der killall manapge:
DESCRIPTION
killall sends a signal to all processes running any of the specified
commands. If no signal name is specified, SIGTERM is sent.

Signals can be specified either by name (e.g. -HUP) or by number (e.g.
-1).
"killall -l" ergibt dazu folgendes:
rashnu@Kickbox:~> killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
rashnu@Kickbox:~>
Im übrigen hab ich
Code:
killall -9 ut2004-bin
( ich benutze lieber direkt die Signalnummern da dadurch die Vertipperwahrscheinlichkeit gesenkt ist und das ganze etwas kürzer ist*G* ) schon öfters erfolgreich genutzt um versehentlich mehrfach gestartete UT 2004 Instanzen zu erschiessen *G*

Bis denne,
Tom
Edit:p.S.: @spunti: Wieso sollte -KILL beim kill-Befehl gehen? Dort heisst es -SIGKILL und beim killall heisst es -KILL ..... Ergo: Du gibst etwas zu was es nicht gibt??
 

spunti

Hacker
gut, jetzt bin ich zufrieden. steht also doch indirekt in der manpage.

(funktioniert nämlich auch ohne und dann frag ich mich schon, was der quatsch soll, wenns nicht mal in der manpage steht, wie ich dachte.)

danke
spunti
 

TomcatMJ

Guru
Klar funktionierts meistens auch ohne, nur sendet killall dann kein KILL sondern ein TERM Signal per default an den Prozess. Wenn ein Prozess darauf nicht reagiert hilft oft aber nur noch ein explizites KILL Signal weiter...und wenn auch das nicht hilft nur ein temporärer Runlevelwechsel (z.b. aus Runlevel 5 mal kurz auf 3 und wieder zurück) oder gar ein Reboot weiter.

Bis denne,
Tom (der zum Glück nur sehr sehr selten auf Zombie-Jagd ins System gehen muss*G*)
 
OP
H

HaukeW

Member
Jedenfalls klappt´s großartig.

Ich genieße es jedesmal geradezu, das Script ~/kill.sh
Code:
killall -KILL wine
xrandr -s 0
auszuführen, weil ich genau weiß, dass ich unter Windows

STRG-ALT-ENTF hätte drücken müssen, zum Prozess runterscrollen, anklicken, auf "beenden" klicken - hoffen, dass es geht - danach Rechtsklick auf den Desktop, Eigenschaften, Auflösung wieder hochstellen.
hätte machen müssen.

Vielen Dank nochmal :)
 
Oben