sed im script per crontab

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von brusko, 03.05.2009.

  1. brusko

    brusko Mitglied

    Dabei seit:
    07.07.2007
    Beiträge:
    28
    Zustimmungen:
    0
    hallo
    und nen schönen Tag wünsche ich,
    Ich bin dabei ein script zu schreiben das mir die daten in eine log-datei schreibt.
    Das klappt auch soweit ganz gut aber nun wollte ich mit sed mir diverse Codes in Namen umändern was auch klappt wenn ich das script per Hand an der shell starte. wenn ich aber per crontab es starte wird sed im script nicht ausgeführt.
    Könnte mir jemand vieleicht sagen warum nicht ?

    ich mal das script:
    PHP:
    #!/bin/sh
    # script zum starten des Programmes Digitemp_DS9097
    # mit chown root tempscript.sh
    # chmod u+s tempscript.sh bearbeitet
    # in /etc/newsyslog.conf mus eingeben werdem:
    # /home/michael/templogfile.log root:wheel 640 7 * @T00 N
    # in /etc/crontab mus eingeben werden:
    # */2 * * * * root /home/michael/tempscript.sh >/dev/null 2>&1 letzte wegen ausgabe zu null wichtig
    # es muss sysutils/smartmontools installiert sein
    # es muss sysutils/mbmon installiert sein
    # Fuehleranzahl mit Festplatte usw rechnen

    anzahlfuehler=22
    templogdatei
    =/home/michael/puffertemplogfile.puffer
    schnittstelle
    =/dev/cuad0
    ausleseProgramm
    =/usr/local/bin/digitemp_DS9097
    auslesesmartctl
    =/usr/local/sbin/smartctl
    hardwaretemp
    =/usr/local/bin/mbmon
    festplatte1
    =/dev/ad0
    tageszeit
    =`date +%H:%M`
    zeitstempel=`date +%b" "%d" "%H:%M:%S`
    upzeit=`expr \( $(date +%s) - $(sysctl -n kern.boottime | awk -F '[ ,]' '{print $4}') \)`

    # Lese und Speicher Sensoren wenn es 00:00 ist
    # oder nach einem Neustart wenn upzeit kleiner/gleich 120 sec
    if [ "$tageszeit"00:00" -o $upzeit -le 120 ]
    then
    $ausleseProgramm 
    --s $schnittstelle >> $templogdatei
    echo Sensoren initialisiert! >> $templogdatei
    fi

    # Lese und Speicher Temperatur
    echo $zeitstempel Festplatte $festplatte1 C: `$auslesesmartctl -a $festplatte1 | awk '/^194/ {print $10}'` >> $templogdatei
    echo $zeitstempel Motherboard C: `$hardwaretemp -r -c1 | awk 'NR==1 {print $3}'` >> $templogdatei
    echo $zeitstempel CPU C: `$hardwaretemp -r -c1 | awk 'NR==2 {print $3}'` >> $templogdatei
    echo $zeitstempel Mainboard/Kontroll-Chip C: `$hardwaretemp -r -c1 | awk 'NR==3 {print $3}'` >> $templogdatei
    $ausleseProgramm 
    -s $schnittstelle --750 --l $templogdatei -"%b %d %H:%M:%S Sensor Nr.:%s %R C: %.2C"

    # Lese die letzten $anzahlfuehler Zeilen der $templogdatei aus und ueberpruefe
    # ob sich da beendet! oder initialisiert! befindet
    letztenzeilen=`tail -n $anzahlfuehler /$templogdatei`
    if [ -
    "`echo $letztenzeilen | grep -w -e beendet! -e initialisiert!`" ]
    then
    echo !!!Fehler!!! >> $templogdatei
    else
    echo 
    Auslesung beendet! >> $templogdatei
    fi

    # Aendere Fuehlercode in Namen
    IFS='
    '
    sensors="105FB2720108004F/Wohnzimmer
    10C7A8720108009E/Flur"

    sedcmd='sed'
    for sensor in $sensors; {
    sedcmd="$sedcmd -e 's/$sensor/1'"
    }

    eval 
    "$sedcmd < $templogdatei > test.test"
    und hier die datei:
    PHP:
    Apr 26 21:06:00 Festplatte /dev/ad0 C27
    Apr 26 21
    :06:00 Motherboard C35.5
    Apr 26 21
    :06:00 CPU C47.2
    Apr 26 21
    :06:00 Mainboard/Kontroll-Chip C21.6
    Apr 26 21
    :06:02 Sensor Nr.:0 10603F72010800A1 C20.94
    Apr 26 21
    :06:03 Sensor Nr.:1 1004BB720108006A C20.88
    Apr 26 21
    :06:04 Sensor Nr.:2 1094B372010800E5 C20.94
    Apr 26 21
    :06:05 Sensor Nr.:3 104A85720108002A C20.88
    Apr 26 21
    :06:07 Sensor Nr.:4 101A9072010800AA C20.94
    Apr 26 21
    :06:08 Sensor Nr.:5 10DA9672010800A9 C21.00
    Apr 26 21
    :06:09 Sensor Nr.:6 10FABB720108000B C20.88
    Apr 26 21
    :06:10 Sensor Nr.:7 1076337201080069 C20.94
    Apr 26 21
    :06:12 Sensor Nr.:8 103E3B7201080083 C21.00
    Apr 26 21
    :06:13 Sensor Nr.:9 1081377201080081 C20.81
    Apr 26 21
    :06:14 Sensor Nr.:10 10C1B272010800ED C20.94
    Apr 26 21
    :06:15 Sensor Nr.:11 105134720108000B C20.94
    Apr 26 21
    :06:16 Sensor Nr.:12 10D999720108009F C20.81
    Apr 26 21
    :06:18 Sensor Nr.:13 10E53072010800CF C20.94
    Apr 26 21
    :06:19 Sensor Nr.:14 10437F72010800A7 C20.88
    Apr 26 21
    :06:20 Sensor Nr.:15 10332D99010800F4 C20.88
    Apr 26 21
    :06:21 Sensor Nr.:16 10C7A8720108009E C20.94
    Apr 26 21
    :06:23 Sensor Nr.:17 105FB2720108004F C20.94
    Auslesung beendet
    !  
    mein system ist FreeBSD und als shell die sh
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 aspire_5652, 03.05.2009
    aspire_5652

    aspire_5652 Tripel-As

    Dabei seit:
    02.01.2008
    Beiträge:
    198
    Zustimmungen:
    0
    die Shell ignoriert alles was in ' eingeschlossen ist. Daher " verwenden:

    das müsste gehen:
    sedcmd="$sedcmd -e \"s/$sensor/1\""
     
  4. brusko

    brusko Mitglied

    Dabei seit:
    07.07.2007
    Beiträge:
    28
    Zustimmungen:
    0
    klappt leider auch nicht, gleiche effekt mit Hand geht es über crontab nicht,
    ich mus vieleicht dazu sagen das ich als root angemeldet bin und darunter das script schreibe. mus ich vieleicht noch irgendwie die Rechte ändern ?
     
  5. #4 floyd62, 03.05.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Dein ursprünglicher Ansatz sieht eigentlich gut aus, und funktioniert bei einer Testdatei bei mir auch so. Da du beim Zusammenbauen deines sed-Kommandos die Strings in " eingefasst hast, werden die Variablen auch korrekt ausgewertet, wie du z.B. mit einem
    Code:
    echo "'$sensor'"
    
    innerhalb der Schleife ja auch einfach überprüfen könntest.

    Denke also, das Problem liegt irgendwo anders; wie sieht dein cron-Jobs genau aus? Bekommst du in der root-Mail (oder wo auch immer du den Output hinschickst; hoffentlich nicht /dev/null ;)) irgendwelche Fehlermeldungen? Unter welcher User-Id wird der ausgeführt?

    Last not least: S-Bit auf Shell-Skripten wirkt wahrscheinlich nicht so, wie du denkst: so ein Skript wird ja nicht wirklich (per exec) ausgeführt, sondern von der Shell interpretiert, und die hat ja kein S-Bit gesetzt. Könnten daher irgendwelche Permissions-Probleme kommen?
     
  6. brusko

    brusko Mitglied

    Dabei seit:
    07.07.2007
    Beiträge:
    28
    Zustimmungen:
    0
    Da ich das script ja immer erst per handeingabe anner shell probiert habe, konnte ich ja sehen das es geht die test.test datei wurde dann ja neu geschrieben mit den geänderten werten. Deswegen lag meine vermutung ja auch vieleicht an Rechte vergeben. Wie der Eintrag in /etc/crontab aussieht kannste am script oben in der 8ten zeile sehen.
    Hier mal die crontab selbst:

    doch ich hab /dev/null
    da die rootmail nicht zugestellt werden kann.
     
  7. #6 floyd62, 03.05.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Dann leg doch den Output zum Debuggen statt auf /dev/null mal nach /tmp/tempscript.out (mit" ... >>/tmp/tmpscript.out 2>&1"), oder ändere den cron-Job so ab, dass er die Meldungen in deine eigene Mailbox schickt, etwa so:
    Code:
    */2 * * * * root /home/michael/tempscript.sh 2>&1 | mail -s tempscript michael
    
    (BTW, warum kann die root-Mail eigentlich nicht zugestellt werden?)
     
  8. brusko

    brusko Mitglied

    Dabei seit:
    07.07.2007
    Beiträge:
    28
    Zustimmungen:
    0
    allgemein ging das mit der mai nicht ,,hatte da irgendwas mal geändert (weis nicht mehr was :-( ) aber da ich irgendwann das system eh noch mal ganz drauf kopieren wollte hatte ich mich da nicht weiter drum gekümmert.
    auch deins jetzt klappt nicht kommt meldung :

    server@stratmann sendmail [sendmail50768]: n43Akos6050768: Losing ./gfn43Akos6050768: savemail panic
    server@stratmann sendmail [sendmail50768]: n43Akos6050768: SYSERR(root): savemail: Cannot save rejected email anywhere

    wenn du weist was ich da mal geändert haben könnte gerne sagen :-)

    kann ich mit das denn nicht irgendwie inne datei schreiben lassen z.b wie >/usr/home/michael/bericht.txt ?
    bzw wenn ich das mache steht in der datei nur er aufruf vom digitemp welches ja im script auch gestartet wird
     
  9. #8 floyd62, 03.05.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Wie oben bereits angedeutet: versuch doch einfach mal
    Code:
    */2 * * * * root /home/michael/tempscript.sh >>/tmp/tmpscript.out 2>&1
    
    oder auch mal
    Code:
    */2 * * * * root sh -x /home/michael/tempscript.sh >>/home/michael/tmpscript.out 2>&1
    
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 brusko, 03.05.2009
    Zuletzt bearbeitet: 03.05.2009
    brusko

    brusko Mitglied

    Dabei seit:
    07.07.2007
    Beiträge:
    28
    Zustimmungen:
    0
    habe gerade deine erste version versucht in der datei steht dann :

    welches der Aufruf vom Digitemp auch ist. mehr steht nicht drin
    bei der zeiten stand mehr drin mus aber ebend kurz PC neu starten

    so hier nun die ausgabe der zweiten datei konnte aber auch kein fehler erkennen.
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Autsch tut dat weh ich hab den fehler anscheinend gefunden *kopf schüttelt*

    und zwar hab in der letzten zeile :
    eval "$sedcmd < $templogdatei > test.test"

    nicht den vollen Pfad der ausgabedatei angegeben und das kann crontab wohl nicht es mus heißen

    eval "$sedcmd < $templogdatei > /usr/home/michael/test.test"

    da auch $templogdatei ja:
    /usr/home/michael/puffertemplogfile.puffer
    bedeutet

    hab das /usr bei manchen pfaden auch im crontab vergessen mal gleich alles nachgetragen
     
  12. #10 floyd62, 03.05.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    cron-Jobs werden normalerwise aus dem Home-Directory des Job-Owners ausgeführt; wenn das wie im Bsp. root war. sollte also die Datei "test.txt" in /root erzeugt worden sein ...

    Wenn ich Daten in einem bestimmten Verzeichnis bearbeite, hat es sich für mich bewährt, gleich mit "cd" dorthin zu wechseln; zum einen kann ich dann die ganzen Datein relativ ansprechen (ohne absolute Pfadangaben), zum anderen kann ich dann gleich überprüfen, ob ich auch richtig angekommen bin und ggf. abbrechen:
    Code:
    DATADIR=...
    cd "$DATADIR" || { echo "!!! Fehler !!!  cd $DATADIR" >&2; exit 1; }
    ...
    sed ... <puffertemplogfile.temp >test.test
    
     
Thema:

sed im script per crontab

Die Seite wird geladen...

sed im script per crontab - Ähnliche Themen

  1. Script ohne Crontab

    Script ohne Crontab: Moin an alle ich hab da ein Problem mit deinem Script das Script lässt sich manuell ausführen aber über die crontab funnnzt es nicht alle rechte...
  2. crontab: wie am best .php script aufrufen? wget oder lynx?

    crontab: wie am best .php script aufrufen? wget oder lynx?: hallo, muss zur regelmässigen kontrolle/reparatur einiger datenbanken per crontab ein paar .php urls aufrufen - wie mache ich das am besten?...
  3. Mit Shellscript einen CronTab manipulieren

    Mit Shellscript einen CronTab manipulieren: Hi Leute, Ich hätt mal ne Frage, weil ich auch noch recht frisch mit der Materie herumkämpfe. Ich habe heute eh schon viel gelernt und würde...
  4. Crontab über PHP Script ändern

    Crontab über PHP Script ändern: Hallo, ich habe ein PHP Script mit dem ich einen Eintrag in der Crontab ändern möchte. Wie gehe ich da vor? Welche Befehle benötige ich...
  5. per shellscript/crontab daten aus sql datenbank loeschen

    per shellscript/crontab daten aus sql datenbank loeschen: Hallo, Ich würde gerne aus meiner MySql DB per Crontab & Shellscript daten aus der Datenbank loeschen. also alles was aelter als 5 Monate ist bzw....