patch für poetd init script

Fragen, Anregungen oder Tipps und Tricks? Hier ist der erste Anlaufpunkt.
Nicht sicher, wo ein Thema hingehört? Hier hinein - wir kümmern uns! :)

Moderator: Forum Moderatoren

Forumsregeln
TM-Startforum - "offen für alle Themen".
Beiträge, die in einen anderen Bereich passen, werden bei Bedarf verschoben.
Antworten
andreas.kotowicz
Beiträge: 69
Registriert: Mittwoch 10. Dezember 2003, 23:20
20

patch für poetd init script

Beitrag von andreas.kotowicz »

ich habe festgestellt, dass das poetd script das in /etc/init.d installiert eine große schwachstelle hat: unter umständen (bzw bei mir immer) wird nicht der parent prozess gestoppt, sondern lediglich ein child prozess, was dann dazu führt, dass nach einem update der datenbank poetd nicht mehr gestartet werden kann. man muss dann nämlich zuerst umständlich den richtigen prozess per hand stoppen.

hier mein patch, der das problem umgeht, indem gleich von vornherein der richtige prozess gestoppt wird:

Code: Alles auswählen

--- poetd.orig	2004-03-25 20:43:01.971961240 +0100
+++ poetd	2004-03-25 20:46:34.554643760 +0100
@@ -93,7 +93,7 @@
 		then
 		#--- das Prog leuft  -----------------------
 		echo "RUN $PROG_NAME  pid: $PROG_GID"
-		echo > $pt_lock
+		echo $PROG_GID > $pt_lock
 		exit 0
 		#-------------------------------------------
 		else
@@ -112,12 +112,12 @@
 stop()
     {
     # Stop PTServer
-    PROG_GID=`pidof -s $PROG_NAME`
+    GID=`more $pt_lock`
 
-    if [ ! -x $PROG_GID ]
+    if [ ! -x $GID ]
 	then
-	    echo "KILL Prog: $PROG_NAME mit gid: $PROG_GID"
-	    kill -9 $PROG_GID
+	    echo "KILL Prog: $PROG_NAME mit gid: $GID"
+	    kill -9 $GID
 	else
 	    echo "STOP ?"
 	    exit 1
Gast

Re: patch für poetd init script

Beitrag von Gast »

Hallo Herr Kotowicz,

gute Idee mit dem Patch, ich werde ihn in mein Turbomed-Update-Script aufnehmen (und es dann hier mal posten). Allerdings passt er scheinbar nicht auf mein aktuelles poetd, beim Aufruf mit

$: patch /etc/init.d/poetd ./poetd.patch

erhalte ich:

patching file /etc/init.d/poetd
Hunk #1 FAILED at 93.
Hunk #2 FAILED at 112.
2 out of 2 hunks FAILED -- saving rejects to file /etc/init.d/poetd.rej

Letztes enthält:
@@ -93,7 +93,7 @@
then
#--- das Prog leuft -----------------------
echo "RUN $PROG_NAME pid: $PROG_GID"
- echo > $pt_lock
+ echo $PROG_GID > $pt_lock
exit 0
#-------------------------------------------
else
@@ -112,12 +112,12 @@
stop()
{
# Stop PTServer
- PROG_GID=`pidof -s $PROG_NAME`
+ GID=`more $pt_lock`

- if [ ! -x $PROG_GID ]
+ if [ ! -x $GID ]
then
- echo "KILL Prog: $PROG_NAME mit gid: $PROG_GID"
- kill -9 $PROG_GID
+ echo "KILL Prog: $PROG_NAME mit gid: $GID"
+ kill -9 $GID
else
echo "STOP ?"
exit 1

Leider kenne ich mich mit patches nicht so gut aus, wo mache ich einen Fehler? (Die Zeilennummern stimmen überein)

Weitere Frage: warum verwenden Sie nicht (mehr) den Befehl

ptsu -shutdown localhost

zum Anhalten des Servers?

Das originale (fehlerhafte) poetd-Startscript wird AFAIK bei jedem Update von der CD neu installiert und der ptserver anschließend sofort damit gestartet, so dass die locking-Datei zumindest beim ersten Mal nicht die Prozess-ID enthält. Man muss den Server also nach dem Update erst wieder anhalten, Ihren patch einspielen und dann wieder starten.

MfG
Roland Colberg
andreas.kotowicz
Beiträge: 69
Registriert: Mittwoch 10. Dezember 2003, 23:20
20

Beitrag von andreas.kotowicz »

Hallo Herr Colberg,

Sie müssen den patch mit

Code: Alles auswählen

 patch < poetd.patch 
einspielen. Dabei wird automatisch im aktuellen Verzeichnis die Datei poetd angepasst.
Weitere Frage: warum verwenden Sie nicht (mehr) den Befehl

ptsu -shutdown localhost

zum Anhalten des Servers?
das war in dem orginal poetd Skript von Mitte März gar nicht drinnen. Da wurde der Server auch schon mit kill -9 beendet. Wobei ich kill -9 für sehr schlecht halte. Meiner Ansicht nach MUSS da ein -15 stehen, da -9 einen Prozess sofort beendet und somit Daten die eventuell noch im Speicher sind, nicht auf die Festplatte geschrieben werden. Deshalb hab ich bei mir das -9 auch durch ein -15 ersetzt (in meinem patch nicht drinnen).

Gruß,
Andreas Kotowicz
Benutzeravatar
Roland_Colberg
PowerUser
Beiträge: 491
Registriert: Freitag 12. Dezember 2003, 17:16
20
Wohnort: Dachau
Kontaktdaten:

poetd script

Beitrag von Roland_Colberg »

Hallo Herr Kotowicz,

stimmt, das steht mit dem ptsu nicht im Originalscript, sondern den Tipp habe ich von einem anderen TM-Linux-Anwender.

Sie müssen allerdings den Library-Pfad vorher exportieren.

Was halten Sie von folgender Stop-Routine:

Code: Alles auswählen

stop()
    {
    # Stop PTServer
    export LD_LIBRARY_PATH
    GID=`more $pt_lock`

    if [ ! -x $GID ]
        then
            echo "KILL Prog: $PROG_NAME mit gid: $GID"
            $pt_su -shutdown localhost
            kill -15 $GID                  # sicherheitshalber
        else
            echo "STOP ?"
            exit 1
    fi

    sleep_

    PROG_GID=`pidof -s $PROG_NAME`
    if [ ! -x $PROG_GID ]
        then
            echo "RUN $PROG_NAME ( oder ein zweites Prog $PROG_NAME )"
        else
            echo "STOP $PROG_NAME"
            rm -f $pt_lock
    fi
    }

Ein Problem bei dieser Art, den Server anzuhalten: man muss mit dem nächsten Start ca. 1 min. warten, scheinbar ist vorher noch irgendwas im Speicher, was einen neuen Start verhindert. Somit gibt es Probleme mit poetd restart: hier muss ein sleep 60 hinein. Vielleicht ist das auch der Grund, warum "jdb" dieses Kommando nicht verwendet.

Das Patchen funktioniert bei mir immer noch nicht, aber das bekomme ich noch heraus...

Viele Grüße
Roland Colberg
Benutzeravatar
Roland_Colberg
PowerUser
Beiträge: 491
Registriert: Freitag 12. Dezember 2003, 17:16
20
Wohnort: Dachau
Kontaktdaten:

Update-Script für TM-Win auf Linux-Server

Beitrag von Roland_Colberg »

Ergänzung: ich habe ein Workaround-Script für das Update erstellt, und hier auch noch den Patch von Herrn Kotowicz untergebracht.

Code: Alles auswählen

#!/bin/bash
#
# Führt das Update auf dem Linux-Server durch, patcht das init-Script
# und kopiert die CD auf den Server
#
# CD liegt in Laufwerk:
SOURCE="/media/cdrom"

# CD wird kopiert in Verzeichnis:
DEST="/opt/data/turbomed_cd"

# Rechte werden gesetzt auf:
OWNER="colberg.praxis"

Patchdatei zur Korrektur des defekten Init-Scripts:
patchdatei="/home/colberg/poetd.patch"

#
# Ab hier braucht nichts mehr geändert werden.
#
serverproc=ptserver

function myproc {
    exec pidof $1 | wc -w
}

if [ $(myproc $serverproc) -gt 2 ];
then
    echo Mehrere Prozesse laufen noch
    echo Das Update wird nicht durchgeführt
    exit
fi

/usr/sbin/TM_update

/etc/init.d/poetd stop

patch /etc/init.d/poetd $patchdatei

mount $SOURCE
cd $SOURCE
rm -R $DEST/*
tar cf - . | (cd $DEST; tar xf - )
chown -R $OWNER $DEST/*
rm -R $DEST/PV3 $DEST/INSTALL
cd
umount $SOURCE

/etc/init.d/poetd start
Hintergrund: wenn (einmalig) ein Link mittels

Code: Alles auswählen

ln -s /opt/data/turbomed_cd/TMWin/ /opt/turbomed/NetSetup
erstellt wird, läuft das Update auf den Arbeitsstationen anschließend nicht nur automatisch, sondern auch schneller als von CD ab.

Roland Colberg
andreas.kotowicz
Beiträge: 69
Registriert: Mittwoch 10. Dezember 2003, 23:20
20

Re: Update-Script für TM-Win auf Linux-Server

Beitrag von andreas.kotowicz »

Roland_Colberg hat geschrieben:

Code: Alles auswählen

patch /etc/init.d/poetd $patchdatei
das muss

Code: Alles auswählen

patch /etc/init.d/poetd < $patchdatei
heissen. sonst geht nix.
andreas.kotowicz
Beiträge: 69
Registriert: Mittwoch 10. Dezember 2003, 23:20
20

Beitrag von andreas.kotowicz »

hab noch was vergessen. es wäre vielleicht bessern den patch vorher mal ausgeführt zu haben und dann die gepatchte version des poetd files immer über die aktuelle version zu kopieren. ich habe nämlich meinen patch auch an turbomed geschickt, so dass diese änderungen eventuell übernommen werden. ein nochmaliges ausführen des patches würde zu einer fehlermeldung führen.
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot], Bing [Bot], DC19, Google [Bot], Semrush [Bot], stef2018r und 49 Gäste