PID auslesen und andre prozesse mit killen

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

PID auslesen und andre prozesse mit killen

Beitrag von bRun0 » 01.09.2006 00:18:30

moin liebe debian liebhaber :)

steh derzeit vor nem kleinen batch problem

ich starte alle 5min (via cron) ein bash script, welches mir eine kleine immer neu generrierte html datei ins WWW lädt...
das script neigt allerdings sich wärend der ftp verbindung immermal aufzuhängen, was dazu führt das, wenn ich dann abends mal von der arbeit komm in meiner prozess übersicht so "einige mehr" an prozessen hängen, die ich abschiesen muss...

jetzt war meine überlegung, lass ich das script, jedesmal wenn es startet, erstmal überprüfen ob noch eine instanz mit dem selben läuft -> soweit war das nichmal schwer, n bissl lesen, n bissl basteln, und funzt auf 2 verschiedenen wegen..

Code: Alles auswählen

#!/bin/bash

script='teeeest'

if [[ -e /tmp/$script ]]; then
rm /tmp/$script
killall $script
/usr/local/bin/$script
echo "$script instanz gefunden und wurde gekillt......"

fi


touch /tmp/$script

##
##aufruf von dem ersteller der html datei und ftp verbindung
##

rm /tmp/$script

exit
so siehts derzeit aus und das funzt auch soweit, mein problem ist allerdings,
bei "killall" killt er sich ja selbst mit :roll:

und genau das will ich vermeiden, er soll ja "danach" das script trotzdem ausführen, ansonsten würde das ja beudeten das erst 10min später was im www ankommt oder sogar 15min

wie also, könnte ich das bewergstelligen, das mir das script erst alle "alten prozesse" mit dem script namen killt, und danach nochmal sich selber startet...

dachte da direkt daran das ich mit ps a und grep was machen kann, hab dazu aber nichts gefunden was mir speziell nur die PIDs der vorherrigen prozesse ausliest
-> das müste dann ja so ablaufen das er alle PIDs mit dem $script namen listet, und die letzte (welche ja logicherweise das prüffende script selber ist) wegläst, und alle andren PIDs killt..

sooo, hoffe ich konnte mich einigermaßen verständlich ausdrücken und hoffe jemand hat für mich ne geeignet lösung :-)

grüße, bRunO

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 00:44:35

Vielleicht mit

kill -15 $(pidof $script | grep -v "$$")

statt

killall $script

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 01.09.2006 00:50:14

Hosi hat geschrieben:Vielleicht mit

kill -15 $(pidof $script | grep -v "$$")

statt

killall $script
mhh, auch wenn ich damit garnichts anfangen kann, hab ich das so übernommen, aber dann bekomm ich folgende meldung

Code: Alles auswählen

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 
:roll: denke da is was nich ganz in ordnung oder?!

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 00:55:35

Hmm, sorry ich hab's nicht getestet und ich dachte, man könnte mit kill auch mehrere PIDs killen.

Dann versuch mal:

for i in $(pidof $script | grep -v "$$"); do kill -15 $i; done

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 00:58:21

Ach man, ich sollte so langsam schlafen gehen.... :-)

Vergiss den vorherigen Post und ruf mal das Skript mit sh -x auf und schau, was genau er in dem kill -Befehl machen will?

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 01.09.2006 01:03:48

Hosi hat geschrieben:Ach man, ich sollte so langsam schlafen gehen.... :-)

Vergiss den vorherigen Post und ruf mal das Skript mit sh -x auf und schau, was genau er in dem kill -Befehl machen will?
O_o jo scho gemerkt :)

er killt die prozesse nich ^^

aber was meinst mit sh -x ?

wie geb ich da ein ? sh -x teeeest

sh -x enter und dann erst das script? O_o
beim ersteren sacht er nich gefunden,

beim zweiten bekomm ich keine andere ausgabe als vorher

...

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 01:10:12

Wenn Du teeest mit sh -x aufrufst, sollte sowas kommen:

Code: Alles auswählen

sh -x ./teeest 
+ script=teeeest
+ '[' -e /tmp/teeeest ']'
+ rm /tmp/teeeest
+ killall teeeest
teeeest: Kein Prozess abgebrochen
+ /usr/local/bin/teeeest
./teeest: line 8: /usr/local/bin/teeeest: Datei oder Verzeichnis nicht gefunden
+ echo 'teeeest instanz gefunden und wurde gekillt......'
teeeest instanz gefunden und wurde gekillt......
+ touch /tmp/teeeest
+ rm /tmp/teeeest
+ exit
Außerdem sollte die 5te Zeile so aussehen:
if [ -e /tmp/$script ]; then

Ich weiß nicht, was die jeweils zwei Klammern [[]] bewirken.

Benutzeravatar
LessWire
Beiträge: 558
Registriert: 21.11.2004 04:36:04
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Bavaria

Beitrag von LessWire » 01.09.2006 01:14:47

Wenn Du im Script ein

echo $$ >> dateiname

einbaust, stehen aufeinanderfolgend die PIDs in <dateiname> und können gezielt gekillt werden.

vg, L.W.

DeletedUserReAsG

Beitrag von DeletedUserReAsG » 01.09.2006 01:17:06

das script neigt allerdings sich wärend der ftp verbindung immermal aufzuhängen, was dazu führt das, wenn ich dann abends mal von der arbeit komm in meiner prozess übersicht so "einige mehr" an prozessen hängen, die ich abschiesen muss...
Nix für ungut, aber wie wäre es mit sauber scripten und so?

cu

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 01.09.2006 02:05:37

soo, hier steht ma die ausgabe

Code: Alles auswählen

sh -x /usr/local/bin/testing
+ script=blubb12
+ [ -e /tmp/blubb12 ]
+ rm /tmp/blubb12
+ pidof blubb12
+ grep -v 12686
+ echo blubb12 instanz gefunden und wurde gekillt......
blubb12 ist in dem fall das von mir vorher erstellte file und auch ein script welches in einer while schleife läuft ist vorhanden, davon ganze 3stk die das script ja killen sollte :)

niemand hat geschrieben:Nix für ungut, aber wie wäre es mit sauber scripten und so?

cu
nix für ungut, aber ich hätte evtl dazu schreiben sollen das dass mein 2tes eigenes script is, und ich kein plan hab was du mit "sauber" meinst?

zu meinem problem hat der post leider nich viel begeitragen...

was die ftp verbindung angeht

Code: Alles auswählen

ftp -n ftp-server <<**
user USER PASS
lcd /var/www/DIR
cd /
put file.html
bye 
**
dieser teil steht unter anderem in dem bereich was danach ausgeführt werden soll...

grüße..

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 03:00:59

red171 hat geschrieben:soo, hier steht ma die ausgabe

Code: Alles auswählen

sh -x /usr/local/bin/testing
+ script=blubb12
+ [ -e /tmp/blubb12 ]
+ rm /tmp/blubb12
+ pidof blubb12
+ grep -v 12686
+ echo blubb12 instanz gefunden und wurde gekillt......
Dann ist doch alles OK, denn /usr/local/bin/testing läuft noch?

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 01.09.2006 03:09:04

Hosi hat geschrieben:Dann ist doch alles OK, denn /usr/local/bin/testing läuft noch?
ja schon, die neue instanz läuft, aber die alten wurden nicht gekillt O_o

hab das grad jetzt nochmal komplett getest, hab das script in nen andren verzeichniss kopiert, und in dem einen ans ende ne endlosschleife gebastelt so das es auch definitiv läuft

dann in ner 2ten ssh session (mach das ganze grad über ssh) das normale script gestartet, was ja jetzt unter /tmp/ das angelegte file findet, und eigentlich die alte kurz zu vor gestartet session killen soll, nur nich sich selbst.. die alte session läuft aber noch... wird somit nich gekillt :(

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 03:36:58

In der sh-x -Ausgabe sehe ich auch nichts von einem kill:

Das sollte dann ungefähr sowas stehen:

Code: Alles auswählen

sh -x /usr/local/bin/testing
+ script=blubb12
+ [ -e /tmp/blubb12 ]
+ rm /tmp/blubb12
+ pidof blubb12
+ grep -v 12686
+ kill -15 12345
+ echo blubb12 instanz gefunden und wurde gekillt...... 
Ansonsten ersetzt mal das kill -15 durch kill -9

Außerdem hast Du dann ja 2 Skripte. Das eine lädt die HTML-Datei hoch und das andere guckt nach, ob das eine noch läuft?
Ich glaub, noch *** geht's nicht.

Aber um mal dabei zu bleiben:
ich hab folgende 2 Skripte

foobar.sh:

Code: Alles auswählen

#!/bin/sh

touch /tmp/foobar

# Hochladen der HTML-Datei....
sleep 10000

# Am Ende.
rm /tmp/foobar

Und check_for_foobar.sh:

Code: Alles auswählen

#!/bin/bash

script='foobar'

if [ -e /tmp/$script ]; then
rm /tmp/$script
killall $script
echo "$script instanz gefunden und wurde gekillt......"

fi

##
##aufruf von dem ersteller der html datei und ftp verbindung
##
./foobar

exit
Wenn ich foobar aufrufe (das Skript, das die HTML-Datei hochlädt) und dann check_for_foobar.sh aufrufe, wird das ursprüngliche foobar gekillt und eine neue Instanz gestartet. Das ist doch das, was Du haben willst?

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 01.09.2006 03:48:46

erstmal danke für deine überaus schnelle und freundliche hilfe :)

aber nochmal zu verständniss -> ich habe "ein" file was ich alle 5min aufrufe

da es sich aber, sagen wir 5-6x täglich wärend der der ftp verbindung "aufhängt" und dadurch ja nicht geschlossen wird, möchte ich beim nächsten autmatischen aufruf einfach nur, das dass script selber für sich überprüft, ob schon eine vorherrige instanz von sich läuft, sollte das der fall sein, soll es nur diese eine vorherrige instanz killen, aber nicht sich selber, da es ja mit der eigentlichen aufgabe danach weiter machen soll...

ich will und möchte aber nich 2 scripte alle 5min starten lassen, nur damit das eine checkt ob das andre in der lage war richtig zu arbeiten, somal ich das dann ja so laufen lassen müsten, in den ersten 5min das, in den 2ten 5min das andre, dann wieder das erste, dann wieder das andere... -> schwachsinn O_o

zur derzeitigen situation wie ich teste obs geht

-> ich selber sitz an nem windows rechner grad mit ZOC(ssh client) am laufen wo ich 2 ssh sessions offen hab, jeweils im selben verzeichniss

-> hab über samba ne freigabe gemacht wo dieses eine file liegt welches im notepad offen habe

-> ich bearbeite die letzten 3zeilen des script und bau nen ewigkeiten sleep ein (wie du das gemacht hast)

-> dann starte ich in der ersten ssh session von zoc das script

-> danach bearbeite ich die 3 zeilen des scripts wieder zum ausgangszustand und speicher

-> danach geh in zoc session2 und starte das script noch einmal
und hier kommt das, was eigentlich geschehen "soll"

die 2te session findet jetzt natürlich mittels des ifs das aktive tmp file, hier soll er jetzt das file löschen UND die ZUVOR gestartete session mit killen. damit keine doppelten instanzen laufen..

ich hoffe das du langsam das problem verstehst :roll: :lol: :oops:


grüße und baldiges gn8, bRunO :)

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 04:07:34

red171 hat geschrieben:erstmal danke für deine überaus schnelle und freundliche hilfe :)
Kein Problem :)

-> ich selber sitz an nem windows rechner
Das ist definitiv schon mal der falsche Ansatz!
ich hoffe das du langsam das problem verstehst :roll: :lol: :oops:
Nee, jetzt hast Du mich total verwirrt.
möchte ich beim nächsten autmatischen aufruf einfach nur, das dass script selber für sich überprüft, ob schon eine vorherrige instanz von sich läuft, sollte das der fall sein, soll es nur diese eine vorherrige instanz killen, aber nicht sich selber, da es ja mit der eigentlichen aufgabe danach weiter machen soll...
Dann schreib doch folgendes in das eine (und alleinige!) Skript hinein:

Code: Alles auswählen

if [ -e /tmp/foobar ]; then
   kill -9 $(cat /tmp/foobar)
fi

echo $$ > /tmp/foobar

# FTP
# HTML-Seite hochladen
# ..

rm /tmp/foobar

grüße und baldiges gn8, bRunO :)
Ja, so langsam wird's Zeit...

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 01.09.2006 04:26:09

und siehe da :-)

es geht genauso wie ich das haben will ^^

ich danke dir viel mals für deine gedult, und sorry das ich danach nochmehr verwirrt hab :)

das mit dem -> die PID in das file schreiben war genau das, was noch gefehlt hat :)

so funzt es und ich muss nich immer manuel irgendwas killen :)

ich geh in mein bett :-) gn8


und btw.
Das ist definitiv schon mal der falsche Ansatz!
das is mir bewust :) aber auch ic möchte ab un an nebenbei nochmal nen game mit ner höheren auflösung als 800x600 spielen :)

-> debian 4tw :) immer und immer wieder :)

Benutzeravatar
Hosi
Beiträge: 226
Registriert: 17.03.2003 15:17:29

Beitrag von Hosi » 01.09.2006 04:34:09

das mit dem -> die PID in das file schreiben war genau das, was noch gefehlt hat
Hmm, siehe post von LessWire...

In diesem Sinne, gute Nacht...

Antworten