• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] cron nur als 'root' ?

OsunSeyi

Hacker
Hi
Habe hier eine ganze Reihe von Scripten, die mittels Cron gestartet werden.
Dazu verwende ich ein zentrales Script, durch das alles weitere angeleiert wird.
Das Problem dabei ist, daß cron letztlich von 'root' ausgeht und in beteiligten Scripten die Variable $HOME vorkommt und dann als /root interpretiert wird und auch die Pfade zu meinen Scripten nicht in der bin-Pfad Variablen vorkommt, also alles mit vollem Namen aufgerufen werden müsste...
Gibt es einen eleganteren Weg, das zu ändern, als alles umzuschreiben?
Also sozusagen zu bewirken, das 'cron' von meinem Account aus arbeitet?
gruß, tom
 
A

Anonymous

Gast
OsunSeyi schrieb:
Also sozusagen zu bewirken, das 'cron' von meinem Account aus arbeitet?

du kannst zwar cron auch als User deiner Wahl Jobs starten lassen, aber dennoch bleibt dir ein Problem. Beim Anmelden an irgend einem Account werden eine ganze Reihe von Variablen und Werten gesetzt, das wird bei Cron nicht gemacht. Es wird also quasi sogut wie gar keine Variable gesetzt sein, (ein paar Ausnahmen bestätigen die Regel) die du als selbstverständlich ansiehst, wie zB. PATH. Desshalb muss man ja auch immer den gesammten Path zu den Dateien und Programmen angeben, oder man setzt eben die Variablen entsprechend wie man sie braucht am Anfang in den Scripten.

robi
 
OP
OsunSeyi

OsunSeyi

Hacker
Die Variablen $HOME und $PATH selber zu setzen, würde sich anbieten.
Gilt das nur für die durch das Skript angestossenen Prozesse, oder muss ich aufpassen, dass ich dadurch
nicht generell $HOME und $PATH von root ändere?
Also zB am Ende vom Script wieder $HOME='/root' setzen ?
tom
 
A

Anonymous

Gast
OsunSeyi schrieb:
Also zB am Ende vom Script wieder $HOME='/root' setzen ?
tom
die Variablen im Script setzen und exportieren, die Variablen gelten nur für die Prozesse selbst oder wenn sie exportiert werden für die Kinderprozesse ebendieser . Wenn also der Prozess den der Cron startet endet, dann ist Schluss mit was auch immer du an Variablen in diesen Scripten gesetzt hast. Rückwärts kann man keine Variablen übergeben oder verändern.

robi
 

regexer

Advanced Hacker
OsunSeyi schrieb:
Die Variablen $HOME und $PATH selber zu setzen, würde sich anbieten.
Ehrlich gesagt habe ich den Anwendungsfall noch nicht ganz kapiert. Es wäre nämlich grundsätzlich möglich, für mehrere Benutzer cron einzurichten. Siehe hierzu die manpages von cron, cron.allow usw.

Falls man doch mit den $HOME-Werten von verschiedenen Usern arbeiten will, bietet die Bash eine wunderbare Lösung an.
~username
... steht z.B. für das Home-Verzeichnis von username.
 
OP
OsunSeyi

OsunSeyi

Hacker
Falls man doch mit den $HOME-Werten von verschiedenen Usern arbeiten will, bietet die Bash eine wunderbare Lösung an.
~usernam
Danke für den Tip!
Es handelt sich um ca. sieben Scripte, die in verschiedenen Unterverzeichnissen von bin liegen, was beim setzen von $PATH nerven würde.(weil man ja auch mal was umbenennt).
Es sollte genügen, die Zeile "## cron_daily" einzusetzen, damit der Job ausgeführt wird.
Im Verzeichnis 'etc/cron.daily' braucht dann nur noch Cron -daily aufgerufen werden, und das ganze rattert los.
Für alle zukünftigen Änderungen entfällt die Auseinandersetzung mit dem Thema (es genügt ja oG. Zeile einzufügen):
Code:
#!/bin/sh
## Cron [-hourly, -daily, -weekly, -monthly]
##	zum Ausfuehren von Cronjobs
##	Eine Logdatei befindet sich in "BIN_ADMIN/.cronlog".

	HOME='/home/tom'

	PATH=`cat $HOME/DAT/D/BIN/BIN_ADMIN/.exportpath`

	log=$HOME'/DAT/D/BIN/BIN_ADMIN/.cronlog'

#X########################################################################################
cd $HOME/DAT/D/BIN
                                             # das "exit 0" ist auch eine Sicherheit,
                                             # weil das Script sonst anfängt alle Befehle
                                             # auszuführen, in denen Egrep "^##[[:space:]]"
                                             # findet (und das sind alle...)
	case $1 in
                  ''  ) echo 'Optionen: [-hourly, -daily, -weekly, -monthly]' ; exit 0 ;;
	     -hourly  ) cron='cron_hourly'  ;;
	     -daily   ) cron='cron_daily'   ;;
	     -weekly  ) cron='cron_weekly'  ;;
	     -monthly ) cron='cron_monthly' ;;

	esac

	#####################################################################
	for i in `ls BIN*/*` ; do

		var=$(cat $i 2>/dev/null | egrep "^##[[:space:]]$cron")

		if [ -n "$var"  ] ; then
	
			befehl=`echo $i | sed 's|^.*/||g'`

			echo `date +%d.%m/%R` '('$cron')' $i':'      >> $log

			#######
			$befehl                                     2>> $log
			#######
		fi
	done
	#####################################################################
exit 0
#X####
 
Oben