Shellscript will nicht als cronjob

Post Reply
Message
Author
Holger

Shellscript will nicht als cronjob

#1 Post by Holger »

Hi Leutz!

Bin echt ratlos und hoffe ihr könnt mir helfen. Ich hab jetzt alle FAQs, HOWTOs und RTFM uns STFW durch...

Folgendes:
Ich betreibe einen LINUX-Rechner als Router für DSL und Fileserver für ein kleines Hausnetzwerk (2 Rechner). Die Kiste steht im Keller und stört keinen. Dennoch denke ich, wenn nachts kein Client mehr an ist, kann die Kiste auch schlafen gehen. Idee ist also: Ich lass stündlich ein Script laufen, daß ein ping auf alle Clients macht und dafür sorgt das der Server sich selber runterfährt.

Dazu habe ich folgendes Script geschrieben (geht vielleicht auch einfacher, aber verzeiht mir, bin noch Anfänger <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> )

Zur Erklärung: Ich mache einen Ping auf den Client, und hol mir durch tail/head/cut die Zahl der empfangenen Pakete. Wenn die 0 ist, ist der Client nicht mehr da. Wenn beide Clients weg sind, mache ich einen shutdown.

#!/bin/bash
ping 192.168.0.13 -w 1 > /var/log/ping_13.txt
tail -2 /var/log/ping_13.txt | head -1 > /var/log/ping_13.txt
cut -c24 /var/log/ping_13.txt > /var/log/client_dead_13.txt
ping 192.168.0.14 -w 1 > /var/log/ping_14.txt
tail -2 /var/log/ping_14.txt | head -1 > /var/log/ping_14.txt
cut -c24 /var/log/ping_14.txt > /var/log/client_dead_14.txt
# wenn alle pakete bei allen clients verloren gingen -> Rechner runterfahren
a=$(more /var/log/client_dead_13.txt)
b=$(more /var/log/client_dead_14.txt)
if [ $a -eq 0 -a $b -eq 0 ]
then
echo "$(date) - Clients down" >> /var/log/ping_shutdown.log
/sbin/shutdown -h now
else
echo "$(date) - Clients alive : $a $b" >> /var/log/ping_shutdown.log
fi
#EOF

Das hab ich unter /etc/cron.hourly geparkt (RedHat 8). Soweit so gut.
Das Script läuft auch brav jede Stunde. Problem ist nur, es läuft nur fehlerlos, wenn ich es als root starte. Wenn dieses Script durch cron initialisiert wird bekommt root folgende Fehlermeldung per mail:

From root@BASEMENT Thu Mar 6 19:02:03 2003
Return-Path: <root@BASEMENT>
Received: from BASEMENT (localhost.localdomain [127.0.0.1])
by BASEMENT (8.12.5/8.12.5) with ESMTP id h26I2323001960
for <root@BASEMENT>; Thu, 6 Mar 2003 19:02:03 +0100
Received: (from root@localhost)
by BASEMENT (8.12.5/8.12.5/Submit) id h26I23uw001958
for root; Thu, 6 Mar 2003 19:02:03 +0100
Date: Thu, 6 Mar 2003 19:02:03 +0100
Message-Id: <200303061802.h26I23uw001958@BASEMENT>
From: root@BASEMENT (Cron Daemon)
To: root@BASEMENT
Subject: Cron <root@basement> run-parts /etc/cron.hourly
X-Cron-Env: <SHELL=/bin/bash>
X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin>
X-Cron-Env: <MAILTO=root>
X-Cron-Env: <HOME=/>
X-Cron-Env: <LOGNAME=root>

/etc/cron.hourly/ping_shutdown.sh:

/etc/cron.hourly/ping_shutdown.sh: line 11: [: too many arguments

--
Die Ausgabe in /va/log/ping_shutdown.log sieht für jede Stunde so aus:
Thu Mar 6 19:01:02 CET 2003 - Clients alive : ::::::::::::::
/var/log/client_dead_13.txt
::::::::::::::
1 ::::::::::::::
/var/log/client_dead_14.txt
::::::::::::::

Wenn root dieses Script startet, ist alles ganz normal:
Mit M&#9500;ñr 5 22:15:18 CET 2003 : Clients alive

Rechte an allen Dateien habe ich mitlerweile großzügig vergeben.

WARUM KLAPPT DAS NICHT ALS CRONJOB???!!!

Wär echt klasse, wenn mir jeand einen Tip geben könnte.

Gruß

Holger

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Shellscript will nicht als cronjob

#2 Post by hjb »

Hi!

Da der Fehler in Zeile 11 ist, ist entweder $a oder $b nicht definiert. In Zeile 9 und 10 verwendest du "more", um diese zu initialisieren - warum nicht "cat"?

Außerdem hat nur Root das Recht, den Rechner herunterzufahren - warum also das Skript nicht als Root laufen lassen? Zudem schreibst du in /var/log, das ist ein Verzeichnis, in dem kein normaler User Schreibrechte haben darf - evtl. nicht mal Leserechte.

Faustregel: Wenn du etwas als normaler User machst, dann sieh zu, daß es komplett im Homedirectory abläuft.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Holger

Re: Shellscript will nicht als cronjob

#3 Post by Holger »

Hi!

Danke für die Antwort! Ich hab mein script mitlerweile umgebaut, nun funzts einwandfrei:

#!/bin/bash
a=$(/bin/ping 192.168.0.13 -w 1 | grep transmitted | cut -c24)
b=$(/bin/ping 192.168.0.14 -w 1 | grep transmitted | cut -c24)
if [ $a -eq 0 -a $b -eq 0 ]
then
echo "$(date) - Clients down" >> /var/log/ping_shutdown.log
/sbin/shutdown -h now
else
echo "$(date) - Clients alive : $a $b" >> /var/log/ping_shutdown.log
fi
#EOF

Der cronjob wurde schon vorher als root gestartet, drum hats mich ja auch gewundert, daß das auf der Konsole funktioniert hat, jedoch nicht als cron. Die Rechte an /var/log sind auch vergeben.

Gruß

Holger

Udo M.

Re: Shellscript will nicht als cronjob

#4 Post by Udo M. »

> a=$(/bin/ping 192.168.0.13 -w 1 | grep transmitted | cut -c24)

Solches geht doch viel einfacher! Warum noch 2 weitere Programme verpipen, wenn es der Returncode bring? Kleiner Denkanstoß:

if ping -c 1 -w 1 HOST; then echo 'er lebt'; else echo 'nix da'; fi

Post Reply