Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
trap signal (nicht ctrl c) fangen, um prozess zu killen

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
killerhippy



Anmeldungsdatum: 19.05.2000
Beiträge: 529

BeitragVerfasst am: 14. Dez 2002 16:00   Titel: trap signal (nicht ctrl c) fangen, um prozess zu killen

Hi,

bash interna sind ja nicht sooo einfach.

Ich habe mir ein script gebastelt, das einfach alle mp3 files der eingelegten cd spielt:
code:

#!/bin/sh

DEVICE=/dev/cdrom
MOUNTPOINT=/mnt/cdrom
MOUNTOPTIONS="-tiso9660"

mount $DEVICE $MOUNTPOINT $MOUNTOPTIONS

trap 'umount $MOUNTPOINT ; exit 32' 0
FILES=`find $MOUNTPOINT -name "*.mp3" -exec echo -n {}"#" \;`
IFS="#"
for i in $FILES; do
echo $i
`mpg123 -y $i`
done
umount $MOUNTPOINT



das spielt einfach die cd durch und damit kann ich schon zufrieden sein :)

zwei Wünsche:

- bei commando Übergabe ein random der liste
- bsp. ctrl+n mpg123 killen, nicht aber das script, damit der gegenwärtige song sofort aufhört und das nexte in der Liste gespielt wird. ctrl+c killt ja gleich alles.

kann man das so einfach mit bash hinkriegen?
_________________
Es gibt keine dumme Fragen!

Killerhippy


Zuletzt bearbeitet von killerhippy am 14. Dez 2002 16:00, insgesamt 2-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Jochen
Gast





BeitragVerfasst am: 14. Dez 2002 17:20   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

Die Sache mit dem Ctrl-C ist einfach. Mein Skript dazu sieht so aus:
code:
#!/bin/sh

DEVICE=/dev/cdrom
MOUNTPOINT=/mnt/cdrom
MOUNTOPTIONS="-tiso9660"

mount $DEVICE $MOUNTPOINT $MOUNTOPTIONS

trap 'umount $MOUNTPOINT ; exit 32' 0

find $MOUNTPOINT -name "*.mp3" -print | while read FILE ; do
echo $FILE
mpg123 -y $FILE
done

exit 0


  • Da das umount-Kommando immer beim Verlassen der Shell aufgerufen wird, brauchst Du es am Ende nicht noch mal angeben.
  • Weshalb hattest Du das mpg123-Kommando in Backquotes `` eingeschlossen? Einfach nur Aufrufen tut's auch...
  • ... und dann hast Du auch direkt das gewünschte Verhalten, dass Ctrl-C nur den mpg123 abbricht, nicht die Shell. Das wird daran liegen, dass mpg123 SIGINT selbst abfängt, um ggf. ein Stück in der Liste der übergebenen Lieder weiter zu springen.

    Nur die Shuffle-Sache tu ich mir jetzt nicht an. Halt, warte - es gibt wirklich nichts, was es nicht gibt! Schau mal hier: http://tiefighter.et.tudelft.nl/~arthur/rl/

    Das sollte die Sache einfach machen...

    Jochen
  •  

    Jochen
    Gast





    BeitragVerfasst am: 14. Dez 2002 17:23   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    ... und zwar so:
    code:

    #!/bin/sh

    # Benötigt rl!

    DEVICE=/dev/cdrom
    MOUNTPOINT=/mnt/cdrom
    MOUNTOPTIONS="-tiso9660"

    if [ "$1" == "shuffle" ] ; then
    SHUFFLE_CMD=rl
    else
    SHUFFLE_CMD=cat
    fi

    mount $DEVICE $MOUNTPOINT $MOUNTOPTIONS

    trap 'umount $MOUNTPOINT ; exit 32' 0

    find $MOUNTPOINT -name "*.mp3" -print | $SHUFFLE_CMD | while read FILE ; do
    echo $FILE
    mpg123 -y $FILE
    done

    exit 0



    Wenn das erste Argument des Skripts "shuffle" lautet, dann ein rl zwischen find und while-Schleife flanschen, ansonsten ein schnödes cat als NOP, sozusagen.

    Jochen
     

    killerhippy



    Anmeldungsdatum: 19.05.2000
    Beiträge: 529

    BeitragVerfasst am: 14. Dez 2002 17:45   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    @jochen:

    danke für die zwei Tips.

    letztes script funktioniert nur mäßig, denn (leider) habe ich cds mit leerzeichen im namen der directories und files.

    aber ich werde mal rumbasteln.

    thanx again.
    _________________
    Es gibt keine dumme Fragen!

    Killerhippy
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    Jochen
    Gast





    BeitragVerfasst am: 14. Dez 2002 18:08   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    OK, Bugfix:
    code:
    #!/bin/sh

    # Benötigt rl!

    DEVICE=/dev/cdrom
    MOUNTPOINT=/mnt/cdrom
    MOUNTOPTIONS="-tiso9660"

    if [ "$1" == "shuffle" ] ; then
    SHUFFLE_CMD=rl
    else
    SHUFFLE_CMD=cat
    fi

    mount $DEVICE $MOUNTPOINT $MOUNTOPTIONS

    trap 'umount $MOUNTPOINT ; exit 32' 0

    IFS=""

    find $MOUNTPOINT -name "*.mp3" -print | $SHUFFLE_CMD | while read FILE ; do
    echo "$FILE"
    mpg123 -y "$FILE"
    done

    exit 0

    Wenn read die Variable FILE füllen will, zerlegt die Shell vorher die Zeile anhand der Trennzeichen in IFS. Ist IFS leer, wird die Zeile der Variablen unverändert zugewiesen. Da dann aber Leerzeichen in FILE vorkommen können, muss jedes weitere Auftreten von $FILE in Anführungszeichen gesetzt werden, damit die Shell dort nicht wieder den Inhalt zerlegt.

    Jochen
     

    killerhippy



    Anmeldungsdatum: 19.05.2000
    Beiträge: 529

    BeitragVerfasst am: 14. Dez 2002 18:18   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    toll, dann erschlägt sich ja die frage, was ich aus `man rl` inzwischen gebastelt hatte:

    code:

    #!/bin/sh

    DEVICE=/dev/cdrom
    MOUNTPOINT=/mnt/cdrom
    MOUNTOPTIONS="-tiso9660"

    mount $DEVICE $MOUNTPOINT $MOUNTOPTIONS

    trap 'umount $MOUNTPOINT ; exit 32' 0

    if [ "$1" == "shuffle" ] ; then
    find $MOUNTPOINT -name '*.mp3' -print0 \
    | rl -0 | xargs -n 1 -0 mpg123 -y
    else
    find $MOUNTPOINT -name '*.mp3' -print0 \
    | xargs -n 1 -0 mpg123 -y
    fi

    exit 0



    wobei das shuffle schön funktioniert, ctrl+c aber auch wieder nicht nur mpg123 abschiesst, sondern auch das script.
    _________________
    Es gibt keine dumme Fragen!

    Killerhippy
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    Jochen
    Gast





    BeitragVerfasst am: 14. Dez 2002 18:46   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    Oh je... Gerade habe ich festgestellt, dass bei meinem RH7.3, auf der ich die ganze Zeit teste, "/usr/bin/mpg123" nur ein Link auf "mpg321" ist. Damit rede ich die ganze Zeit von einem anderen Programm, ohne es zu merken...

    Sorry. Mein letzter Tip wäre also, mpg321 statt mpg123 zu benutzen. Denn bei mir haut es genau so hin, wie Du es gerne hättest!

    Jochen
     

    killerhippy



    Anmeldungsdatum: 19.05.2000
    Beiträge: 529

    BeitragVerfasst am: 14. Dez 2002 18:53   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    wieso meinst du das denn? das letzte script, was du gepostet hast, funktioniert super und ich freu' mir 'n ast ab dabei :)

    handelt mpg321 die signals anders als mpg123???

    also ich bin's zufrieden, wie man so schön sagt...
    _________________
    Es gibt keine dumme Fragen!

    Killerhippy
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    Jochen
    Gast





    BeitragVerfasst am: 15. Dez 2002 13:57   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    Sagtest Du nicht, ctrl-c würde wieder das ganze Skript abbrechen statt nur den gerade laufenden mpg123?

    Jochen
     

    killerhippy



    Anmeldungsdatum: 19.05.2000
    Beiträge: 529

    BeitragVerfasst am: 15. Dez 2002 15:27   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    das bezog sich auf meinen eigenen murks, nicht auf deine scripte.

    das "Ok, Bugfix" script, ist das, was gut läuft und die cd in ordered oder shuffle mode abspielen kann.

    trap will bloss nicht mehr so richtig. von 'ner anderen konsole geKILLed werden trap kommandos ausgeführt.
    von der gleichen konsole funktioniert das nicht mehr. lass mal beschreiben:
    1x ctrl-c -> killt diesen song, weiter mit nexter song
    2x ctrl-c -> ""
    ctrl-c gedrueckt halten -> killt diesen und nexten song, killt das script, trap aber auch. keine konsolenangabe diesbezüglich.

    man bash sagt dazu:
    The ERR trap is not executed if the failed command
    is part of an until or while loop,

    ok, dann frage ich mich bloss, warum ein entferntes kill funktioniert
    _________________
    Es gibt keine dumme Fragen!

    Killerhippy
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    killerhippy



    Anmeldungsdatum: 19.05.2000
    Beiträge: 529

    BeitragVerfasst am: 17. Dez 2002 17:09   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    Inzwischen habe ich herausgefunden, worin meine trap-Schwierigkeit liegt.

    wenn ich solange CTRL-C drücke, daß mpg123 beendet wird, und keinen neuen Song anfängt und wieder loslasse, kommt trap zum Zuge.

    wenn ich zulange CTRL-C drücke, wird wohl auch trap vom CTRL-C erledigt. Kann man das Verhalten beeinflussen? Ich konnte da in manpages nichts drüber finden.

    Andere Frage: Ich freu' mich so über dieses miniscript, bist du Jochen damit einverstanden, wenn ich's als Kurztipp bei Prolinux einsende?
    Schreib' mir ne email, wenn du mit vollem Namen unter den Autoren mit aufgenommen werden willst.
    _________________
    Es gibt keine dumme Fragen!

    Killerhippy
     
    Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

    Jochen
    Gast





    BeitragVerfasst am: 18. Dez 2002 10:00   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    Von mir aus gerne. Verweise einfach auch auf den Thread hier im Forum, dann jat sich das mit der Namensnennung auch schon erledigt.

    Jochen
     

    rattengift
    Gast





    BeitragVerfasst am: 22. Dez 2002 23:08   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    wär doch nett, wenn man jetzt noch das shuffle selber programmieren würde und so nicht mehr auf das "rl" angewiesen wäre. eigentlich gar nicht so schwierig. die datei-liste wird in ein tmp-file geschrieben (löschen in der trapfunction nicht vergessen), mit $RANDOM % $(wc -l tmpfile) würfelt man eine zeilennummer und spielt das file ab. dann muss nur noch die gewählte zeile aus dem tmp-file gelöscht werden, aber dafür gibts sicher auch ne einfache lösung.
     

    rattengift
    Gast





    BeitragVerfasst am: 04. Jan 2003 22:49   Titel: Re: trap signal (nicht ctrl c) fangen, um prozess zu killen

    @rattengift

    > wär doch nett, wenn man jetzt noch das shuffle selber programmieren würde und so nicht mehr auf das "rl" angewiesen wäre.
    > eigentlich gar nicht so schwierig.

    hm, schwierig ist es tatsächlich nicht, nur leider erheblich langsamer als das "original-rl" (wenn man mit bash gegen C antritt hat man eben schon verloren ).
    ich habs interessehalber mal zusammengebastelt. hier der code:
    code:
    #!/bin/bash

    function rl () # randomize lines
    { # input: file aus $1 (oder stdin falls kein $1 angegeben). ausgabe auf stdout

    local FILE=$1 # input
    local FILEIN=/tmp/tmp.shuffle$$ # datei mit den noch verbliebenen zeilen

    # kopiere input in tmp-datei und zähle zugleich die zeilen:
    local LOC=$(cat $FILE | tee $FILEIN | wc -l)

    while [ $LOC -gt 0 ]; do
    # würfle eine zeile. (mit rnd aus 0..32767 liefert "rnd % loc" eine zahl aus 0..loc-1)
    local LINEPICK=$[ 1 + $RANDOM % $LOC ]

    # gib gewählte zeile aus:
    sed ${LINEPICK}!d $FILEIN

    # entferne gewählte zeile aus liste
    #("ed" ist etwas schneller als "cat $FILEIN | sed ${LINEPICK}d > $FILEIN")
    ed -s $FILEIN << HERE
    ${LINEPICK}d
    wq
    HERE

    LOC=$[ $LOC - 1 ]
    done

    rm -f $FILEIN
    }

    rl $1
    exit 0

    der ansatz ist wohl einigermassen brute force (sed/ed werden $LOC mal aufgerufen), aber spezielle optimierungen sind mir jetzt nicht eingefallen.
    für eine datei von 300 zeilen brauchts auf meinem (recht schnellen) rechner gähnend lange 2 sekunden. wenn man das playerskript etwas umbauen würde (so dass nicht das ganze shuffle gleich am anfang erledigt wird, sondern jeder song erst bei bedarf ausgelost wird) würde man die performance-einbusse allerdings nicht mehr spüren (bei mir wärens <0.01sec pro song).
     

    Beiträge vom vorherigen Thema anzeigen:   
         Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
    Seite 1 von 1

     
    Gehen Sie zu:  

    Powered by phpBB © phpBB Group
    pro_linux Theme © 2004 by Mandaxy