sed im script per crontab

B

brusko

Mitglied
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 -i -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 -r -750 -a -l $templogdatei -o "%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 [ -n "`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 C: 27
Apr 26 21:06:00 Motherboard C: 35.5
Apr 26 21:06:00 CPU C: 47.2
Apr 26 21:06:00 Mainboard/Kontroll-Chip C: 21.6
Apr 26 21:06:02 Sensor Nr.:0 10603F72010800A1 C: 20.94
Apr 26 21:06:03 Sensor Nr.:1 1004BB720108006A C: 20.88
Apr 26 21:06:04 Sensor Nr.:2 1094B372010800E5 C: 20.94
Apr 26 21:06:05 Sensor Nr.:3 104A85720108002A C: 20.88
Apr 26 21:06:07 Sensor Nr.:4 101A9072010800AA C: 20.94
Apr 26 21:06:08 Sensor Nr.:5 10DA9672010800A9 C: 21.00
Apr 26 21:06:09 Sensor Nr.:6 10FABB720108000B C: 20.88
Apr 26 21:06:10 Sensor Nr.:7 1076337201080069 C: 20.94
Apr 26 21:06:12 Sensor Nr.:8 103E3B7201080083 C: 21.00
Apr 26 21:06:13 Sensor Nr.:9 1081377201080081 C: 20.81
Apr 26 21:06:14 Sensor Nr.:10 10C1B272010800ED C: 20.94
Apr 26 21:06:15 Sensor Nr.:11 105134720108000B C: 20.94
Apr 26 21:06:16 Sensor Nr.:12 10D999720108009F C: 20.81
Apr 26 21:06:18 Sensor Nr.:13 10E53072010800CF C: 20.94
Apr 26 21:06:19 Sensor Nr.:14 10437F72010800A7 C: 20.88
Apr 26 21:06:20 Sensor Nr.:15 10332D99010800F4 C: 20.88
Apr 26 21:06:21 Sensor Nr.:16 10C7A8720108009E C: 20.94
Apr 26 21:06:23 Sensor Nr.:17 105FB2720108004F C: 20.94
Auslesung beendet!

mein system ist FreeBSD und als shell die sh
 
die Shell ignoriert alles was in ' eingeschlossen ist. Daher " verwenden:

das müsste gehen:
sedcmd="$sedcmd -e \"s/$sensor/1\""
 
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 ?
 
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?
 
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:

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.32.32.1 2008/11/25 02:59:29 kensmith Exp $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour mday month wday who command
#
*/2 * * * * root /home/michael/tempscript.sh >/dev/null 2>&1
*/5 * * * * root /usr/libexec/atrun
#
# Save some entropy so that /dev/random can re-seed on boot.
*/11 * * * * operator /usr/libexec/save-entropy
#
# Rotate log files every hour, if necessary.
0 * * * * root newsyslog
#
# Perform daily/weekly/monthly maintenance.
1 3 * * * root periodic daily
15 4 * * 6 root periodic weekly
30 5 1 * * root periodic monthly
#
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time. See adjkerntz(8) for details.
1,31 0-5 * * * root adjkerntz -a

doch ich hab /dev/null
da die rootmail nicht zugestellt werden kann.
 
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?)
 
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
 
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
 
habe gerade deine erste version versucht in der datei steht dann :

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http:/www.digitemp.com

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.
+ 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
+ date +%H:%M
+ tageszeit=13:12
+ date +%b %d %H:%M:%S
+ zeitstempel=May 03 13:12:00
+ date +%s
+ awk -F [ ,] {print $4}
+ sysctl -n kern.boottime
+ expr ( 1241349120 - 1239654296 )
+ upzeit=1694824
+ [ 13:12 = 00:00 -o 1694824 -le 120 ]
+ /usr/local/sbin/smartctl -a /dev/ad0
+ awk /^194/ {print $10}
+ echo May 03 13:12:00 Festplatte /dev/ad0 C: 25
+ /usr/local/bin/mbmon -r -c1
+ awk NR==1 {print $3}
+ echo May 03 13:12:00 Motherboard C: 33.0
+ /usr/local/bin/mbmon -r -c1
+ awk NR==2 {print $3}
+ echo May 03 13:12:00 CPU C: 43.2
+ /usr/local/bin/mbmon -r -c1
+ awk NR==3 {print $3}
+ echo May 03 13:12:00 Mainboard/Kontroll-Chip C: 21.1
+ /usr/local/bin/digitemp_DS9097 -s /dev/cuad0 -r -750 -a -l /home/michael/puffertemplogfile.puffer -o %b %d %H:%M:%S Sensor Nr.:%s %R C: %.2C
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
+ tail -n 22 //home/michael/puffertemplogfile.puffer
+ letztenzeilen=May 03 13:12:00 Festplatte /dev/ad0 C: 25
May 03 13:12:00 Motherboard C: 33.0
May 03 13:12:00 CPU C: 43.2
May 03 13:12:00 Mainboard/Kontroll-Chip C: 21.1
May 03 13:12:01 Sensor Nr.:0 10603F72010800A1 C: 18.38
May 03 13:12:02 Sensor Nr.:1 1004BB720108006A C: 18.31
May 03 13:12:04 Sensor Nr.:2 1094B372010800E5 C: 18.31
May 03 13:12:05 Sensor Nr.:3 104A85720108002A C: 18.38
May 03 13:12:06 Sensor Nr.:4 101A9072010800AA C: 18.31
May 03 13:12:07 Sensor Nr.:5 10DA9672010800A9 C: 18.44
May 03 13:12:08 Sensor Nr.:6 10FABB720108000B C: 18.31
May 03 13:12:09 Sensor Nr.:7 1076337201080069 C: 18.31
May 03 13:12:11 Sensor Nr.:8 103E3B7201080083 C: 18.44
May 03 13:12:12 Sensor Nr.:9 1081377201080081 C: 18.31
May 03 13:12:13 Sensor Nr.:10 10C1B272010800ED C: 18.38
May 03 13:12:14 Sensor Nr.:11 105134720108000B C: 18.31
May 03 13:12:15 Sensor Nr.:12 10D999720108009F C: 18.31
May 03 13:12:17 Sensor Nr.:13 10E53072010800CF C: 18.38
May 03 13:12:18 Sensor Nr.:14 10437F72010800A7 C: 18.25
May 03 13:12:19 Sensor Nr.:15 10332D99010800F4 C: 18.38
May 03 13:12:20 Sensor Nr.:16 10C7A8720108009E C: 18.38
May 03 13:12:21 Sensor Nr.:17 105FB2720108004F C: 18.38
+ echo May+ grep -w -e beendet! -e initialisiert!
03 13:12:00 Festplatte /dev/ad0 C: 25 May 03 13:12:00 Motherboard C: 33.0 May 03 13:12:00 CPU C: 43.2 May 03 13:12:00 Mainboard/Kontroll-Chip C: 21.1 May 03 13:12:01 Sensor Nr.:0 10603F72010800A1 C: 18.38 May 03 13:12:02 Sensor Nr.:1 1004BB720108006A C: 18.31 May 03 13:12:04 Sensor Nr.:2 1094B372010800E5 C: 18.31 May 03 13:12:05 Sensor Nr.:3 104A85720108002A C: 18.38 May 03 13:12:06 Sensor Nr.:4 101A9072010800AA C: 18.31 May 03 13:12:07 Sensor Nr.:5 10DA9672010800A9 C: 18.44 May 03 13:12:08 Sensor Nr.:6 10FABB720108000B C: 18.31 May 03 13:12:09 Sensor Nr.:7 1076337201080069 C: 18.31 May 03 13:12:11 Sensor Nr.:8 103E3B7201080083 C: 18.44 May 03 13:12:12 Sensor Nr.:9 1081377201080081 C: 18.31 May 03 13:12:13 Sensor Nr.:10 10C1B272010800ED C: 18.38 May 03 13:12:14 Sensor Nr.:11 105134720108000B C: 18.31 May 03 13:12:15 Sensor Nr.:12 10D999720108009F C: 18.31 May 03 13:12:17 Sensor Nr.:13 10E53072010800CF C: 18.38 May 03 13:12:18 Sensor Nr.:14 10437F72010800A7 C: 18.25 May 03 13:12:19 Sensor Nr.:15 10332D99010800F4 C: 18.38 May 03 13:12:20 Sensor Nr.:16 10C7A8720108009E C: 18.38 May 03 13:12:21 Sensor Nr.:17 105FB2720108004F C: 18.38
+ [ -n ]
+ echo Auslesung beendet!
+ IFS=

+ sensors=105FB2720108004F/Wohnzimmer
10C7A8720108009E/Flur
+ sedcmd=/usr/bin/sed
+ sedcmd=/usr/bin/sed -e 's/105FB2720108004F/Wohnzimmer/1'
+ sedcmd=/usr/bin/sed -e 's/105FB2720108004F/Wohnzimmer/1' -e 's/10C7A8720108009E/Flur/1'
+ eval /usr/bin/sed -e 's/105FB2720108004F/Wohnzimmer/1' -e 's/10C7A8720108009E/Flur/1' < /home/michael/puffertemplogfile.puffer > test.test
+ /usr/bin/sed -e s/105FB2720108004F/Wohnzimmer/1 -e s/10C7A8720108009E/Flur/1
.
.
.
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
 
Zuletzt bearbeitet:
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
 

Ähnliche Themen

Switche abfragen über Script

Mein Server versendet SPAM in Massen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Prozess aus eigenem Init script wird gekillt

script per Cronjob ausführen

Zurück
Oben