Shellskript - Fehler in Cron

G

Gast123

Hallo Leute,

ich habe das komische Problem, dass eines meiner Shellskripte nicht funktioniert, wenn es als Cronjob ausgeführt wird:
Code:
#! /bin/bash

HDDTEMP=/usr/sbin/hddtemp
MIN_TEMP_THRESH=0
MAX_TEMP_THRESH=60

VERBOSE=false
RETVAL=0

USAGE="Usage: `basename $0` { ARGS.. }
ARGS: 
	-min, --min-temp	VAL	Set Minimum temperature threshold to VAL °C
	-max, --max-temp	VAL	Set Maximum temperature threshold to VAL °C
	 -v, --verbose			Print verbose information
(C) 2012 Richard Neumann"

eval_disk_temp() {
	local DISK_TEMP="$1"
        local DISK_TEMP_VAL=$(echo "$DISK_TEMP" | /bin/cut -d "°" -f 1)

	if [ $DISK_TEMP_VAL -le $MIN_TEMP_THRESH ]; then
		echo -e "\e[1;34m$DISK_TEMP\e[00m"
		return 1
	elif [ $DISK_TEMP_VAL -ge $MAX_TEMP_THRESH ]; then
		echo -e "\e[0;31m$DISK_TEMP\e[00m"
		return 2
	else
		echo -e "$DISK_TEMP"
		return 0
	fi
}

measure_disks() {
	for DISK in /dev/sd?; do
		HDDTEMP_REPLY="`$HDDTEMP $DISK`"
		DISK_DEV="`echo $HDDTEMP_REPLY | cut -d ":" -f 1`"
		DISK_NAME="`echo $HDDTEMP_REPLY | cut -d ":" -f 2`"
		DISK_TEMP="`echo $HDDTEMP_REPLY | cut -d ":" -f 3`"

		echo -en "Disk: $DISK_DEV"
		if ($VERBOSE); then
			echo -en "\n\t$DISK_NAME\n\t"
			eval_disk_temp $DISK_TEMP
			RETVAL=$(($RETVAL+$?))
		else
			echo -en "\t\t\t"
			eval_disk_temp $DISK_TEMP
        	        RETVAL=$(($RETVAL+$?))
		fi
	done
	return $RETVAL
}
	
while (( $# )); do
	case $1 in
		-v|--verbose)		VERBOSE=true
		;;
		-min|--min-temp)	MIN_TEMP_THRESH=$2
					shift
		;;	
		-max|--max-temp)	MAX_TEMP_THRESH=$2
					shift
		;;	
		-h|--help)		echo -e "$USAGE"
					exit 0
		;;
		*)			echo -e "ERROR:\tUnknown command '$1'" 1>&2
					exit -1
	esac
	shift
done

measure_disks
Wenn ich es in einer Konsole ausführe, tut es was es soll.
Leider nicht, wenn es durch root's Crontab ausgeführt wird.
Dann erhalte ich eine Systemmail mit dem Inhalt:
Code:
From root@weinheim.localdomain  Wed Jul 24 11:41:02 2013
Return-Path: <root@weinheim.localdomain>
X-Original-To: root
Delivered-To: root@weinheim.localdomain
Received: by weinheim.localdomain (Postfix, from userid 0)
        id 74B9FD60900; Wed, 24 Jul 2013 11:41:02 +0200 (CEST)
From: root@weinheim.localdomain (Cron Daemon)
To: root@weinheim.localdomain
Subject: Cron <root@weinheim> /usr/local/sbin/disktemps > /etc/disktemps
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20130724094102.74B9FD60900@weinheim.localdomain>
Date: Wed, 24 Jul 2013 11:41:01 +0200 (CEST)

/bin/cut: the delimiter must be a single character
Try `/bin/cut --help' for more information.
/usr/local/sbin/disktemps: line 21: [: -le: unary operator expected
/usr/local/sbin/disktemps: line 24: [: -ge: unary operator expected
/bin/cut: the delimiter must be a single character
Try `/bin/cut --help' for more information.
/usr/local/sbin/disktemps: line 21: [: -le: unary operator expected
/usr/local/sbin/disktemps: line 24: [: -ge: unary operator expected
/bin/cut: the delimiter must be a single character
Try `/bin/cut --help' for more information.
/usr/local/sbin/disktemps: line 21: [: -le: unary operator expected
/usr/local/sbin/disktemps: line 24: [: -ge: unary operator expected

Ich kann das überhaupt nicht nachvollziehen.

MfG

Schard

PS: Es geht nachdem ich das
Code:
/bin/cut -d "°" -f 1
durch
Code:
awk -F'°' '{print $1}'
ersetzt habe.
Ich würde trotzdem gerne verstehen, warum cut in der Konsole functioniert, nicht aber in Cron.

PPS: Aha. Wenn das Skript übder die Crontab ausgeführt wird, wird der Charakter "°" nicht dargestellt. Warum auch immer.
Ich hab
Code:
/bin/cut -d "°" -f 1
jetzt durch
Code:
 grep -oE '[0-9]*[0-9]'
ersetzt. das geht nun in beiden Fällen.
Komische Sache...
 
Zuletzt bearbeitet von einem Moderator:
Spröde

Spröde

Alter Sack
Scheint ein Kodierungsproblem zu sein. Du kannst es ja mal Oktal probieren:
Code:
~> echo -e \\0302\\0260
°

Ach ja: Die Bash kann auch selber cutten:
Code:
~> Test=12°34
~> echo ${Test//°*}
12
 
F

floyd62

Routinier
Hi,

ich nehme an, du verwendest in der Shell UTF-8, und dein Skript ist dann ebenfalls mit UTF-8-Codierung abgespeichert. In der Cron-Umgebung wird, sofern nicht explizit gesetzt, wahrscheinlich Standard (LANG=C) benutzt. Wenn du am Anfang deines Skripts also ein
Code:
LANG=en_US.UTF-8 export LANG
einfügst, sollte das auch laufen. (Mit LANG=C interpretiert "cut" das "°" nicht als ein einzelnes, sondern als 2 Zeichen, oktal \0302 und \0260.)

Gruss, A.
 

Ähnliche Themen

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

Variableninhalt wird nicht gespeichert

Shell if-Abfrage mit equal or greater wirft Fehlermeldung unary operator expected

Prozess aus eigenem Init script wird gekillt

Rollei Mini Wifi Camcorder

Oben