PID ändern...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

PID ändern...

Beitrag von jhr-online » 14.02.2006 23:40:19

Irgendwie komme ich mit Suchen nicht weiter... Ich habe ein Script, das mit zwei Parametern gestartet wird, z.B.:

Code: Alles auswählen

./script.sh 50 70
Ein zweites Script macht etwas ähnliches, sofern es aufgerufen wird und muss daher das erste vorher beenden. Dem zweiten Script ist aber nur der zweite Parameter bekannt; der ist aber auch erforderlich, weil evtl. das erste Script mehrmals mit verschiedenen Parametern gestartet ist. Wie also kille ich das erste Script (aber das mit dem richtigen zweiten Parameter)?
Im Chat sprach ryven davon, die Parameter in die PID miteinzubinden oder so. Dazu habe ich aber noch nichts gefunden. Vielleicht kann mir jemand sagen, wie ich dem Script beibringen kann, seinen zweiten Parameter an die PID auszuliefern oder so, damit ich es so auch wieder killen kann?

jhr

PS: Falls unverständlich, bitte nachfragen! Ist schon spät... ;-)
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Methusalix

PID ändern...

Beitrag von Methusalix » 15.02.2006 00:42:35

Hallo,

vielleicht helfen ein paar grundsätzliche Anmerkungen weiter. Die "PID" ist die Prozess-ID eines Programmes. Sie läßt sich z.B. so erfragen:

Code: Alles auswählen

ps -x | grep bash
5215 pts/0    Ss+    0:00 bash
 5219 pts/1    Ss     0:00 bash
 5468 pts/2    Rs     0:00 bash
Du kannst dann anschließend mit z.B. kill ein Signal an den Prozeß senden.

Code: Alles auswählen

kill pid ...             Send SIGTERM to every process listed.
       kill signal pid ...      Send a signal to every process listed.
       kill -s signal pid ...   Send a signal to every process listed.
       kill -l                  List all signal names.
       kill -l signal           Convert a signal number into a name.
Du könntest versuchen, so etwas in der Art in Dein Script einzubauen. Wahrscheinlich gibt es da auch noch andere Möglichkeiten. Das mit der Bindung an verschiedene Parameter ist mir noch nicht so ganz klar.

Gruß
Matthias

Benutzeravatar
puntarenas
Beiträge: 712
Registriert: 28.05.2005 15:07:05

Beitrag von puntarenas » 15.02.2006 01:28:53

Ich bin nicht sicher, ob ich so richtig verstanden habe worum es geht, aber falls doch gibt es eine einfache Möglichkeit, du rufst dein zweites Script mit exec auf.
exec

This shell builtin replaces the current process with a specified command. Normally, when the shell encounters a command, it forks off a child process to actually execute the command. Using the exec builtin, the shell does not fork, and the command exec'ed replaces the shell. When used in a script, therefore, it forces an exit from the script when the exec'ed command terminates.
Näheres verrät die Advanced-Bash-Scripting-Guide

Gruß
puntarenas

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 15.02.2006 01:49:32

na gut, dann mag ich auch einen Versuch haben :)

Code: Alles auswählen

#!/bin/sh
#
# das Script Nr. 2

kill `ps -o pid,args -C script1.sh | grep "$PARAM2$" | colrm 6`
- ps erzeugt eine Liste mit allen 'script1'-Prozessen
- grep sucht den mit dem passenden 2. Parameter PARAM2 raus,
- colrm reduziert die Zeile auf die PID
- kill erledigt den Rest

BUGS:
- geht nur mit dem letzten Parameter ('$' hinter PARAM2)
- geht nur auf Systemen, deren PIDs max. 5-stellig sind
- geht mit einer anderen Version von 'ps' eher nicht
- allles mögliche, was ich übersehen hab'

Aber im Prinzip...
Beware of programmers who carry screwdrivers.

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 15.02.2006 08:27:00

cosmac hat geschrieben: - geht nur auf Systemen, deren PIDs max. 5-stellig sind
Okay, ich danke dir erstmal. Ich denke, das könnte gut hinhauen, aber kannst du (oder natürlich jeder andere) mir verklickern, ob/wie ich verhindern kann, dass die PID länger wird? Die wird ja wohl nicht hochgezählt und nach 12 Jahren 19-stellig sein, oder? :-)

jhr

//edit: Könnte man das Problem nicht noch umgehen, indem man die PID nicht direkt an kill ausliefert, sondern erst in einer Variable und die Variable daraufhin testen, ob sie überhaupt ne Zahl ist, oder so?
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 15.02.2006 10:09:40

jhr-online hat geschrieben:... ob/wie ich verhindern kann, dass die PID länger wird? Die wird ja wohl nicht hochgezählt und nach 12 Jahren 19-stellig sein, oder? :-)
die wird hochgezählt und fängt nach 32767 wieder von vorn an -
jedenfalls unter Sarge und älter. Das kann auf einem gut beschäftigten
System nach ein paar Stunden passieren, was unschön ist.

Aber die korrekte Methode ist natürlich, die Ausgabe von 'ps' nicht einfach
nach 6 Zeichen, sondern beim Zwischenraum nach der PID abzuschneiden
und fertig. Aber vor der PID kann auch ein Zwischenraum sein oder nicht,
und deshalb ist mir das zu kompliziert.
Könnte man das Problem nicht noch umgehen, indem man die PID nicht direkt an kill ausliefert, sondern erst in einer Variable und die Variable daraufhin testen, ob sie überhaupt ne Zahl ist, oder so?
nicht nötig, es ist auf jeden Fall eine Zahl (wegen: ps -o pid,args),
aber wenn sie länger als 5 Stellen würde, würde sie abgeschnitten und 'kill'
würde u.U. einen Unschuldigen erwischen.
Beware of programmers who carry screwdrivers.

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 15.02.2006 19:41:47

cosmac hat geschrieben:die wird hochgezählt und fängt nach 32767 wieder von vorn an
Dann funktioniert der Befehl oben doch immer (unter sarge), da die PID nie über 5 Zeichen geht. Ist doch alles in Butter so... oder nicht?!

Danke,
jhr
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Antworten