Shellskript - Fehler in Cron

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Gast123, 24.07.2013.

  1. #1 Gast123, 24.07.2013
    Zuletzt von einem Moderator bearbeitet: 24.07.2013
    Gast123

    Gast123 Guest

    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...
     
  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 Spröde, 24.07.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    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
     
  4. #3 floyd62, 24.07.2013
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    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.
     
Thema:

Shellskript - Fehler in Cron

Die Seite wird geladen...

Shellskript - Fehler in Cron - Ähnliche Themen

  1. Wie einen Pfad zur Vereinfachung mittels Shellskript wechseln

    Wie einen Pfad zur Vereinfachung mittels Shellskript wechseln: Ich muß häufiger in 2 bestimmte Verzeichnisse auf 3. oder 4. Ebene wechseln. Um nicht permanent cd /ordnerA/ordnerB/ordnerC... usw eingeben zu...
  2. Shellskript per PHP aufrufen funktioniert nicht

    Shellskript per PHP aufrufen funktioniert nicht: Hallo zusammen, ihr seid meine letze Hoffnung, seit heute morgen versuche ich ein shellskript zum laufen zu bekommen. Folgende...
  3. Problem bei Shellskript

    Problem bei Shellskript: Hey Leute, ich soll ein Shellskript schreiben welches einen Verzeichnis, welches ich als Paramter angebe, rekursiv nach der Textdatei mit den...
  4. Reengineering Shellskripte

    Reengineering Shellskripte: Hallo Community, ich habe ein Problem wo ich leider keine Lösung finde. Es gibt eine Liste von Shell-skripten die in unterschiedlichen...
  5. Servicemenu ruft Shellskript nicht auf

    Servicemenu ruft Shellskript nicht auf: Hallo zusammen, ich habe gerade ein Shellskript gebastelt das Bilder verkleinert und in einen neuen Ordner packt. Per Konsole funktioniert es...