Cron mit (xmessage) Benutzerinteraktion?

clearness

Member
Hallo! Ich suche nach einer Möglichkeit mit der regelmäßig das System aktualisiert wird, es sei denn, der Benutzer möchte es zu dem Zeitpunkt nicht. Ich dachte an Cron mit Verwendung von xmessage, aber dabei fehlt mir noch der Zugriff auf das Display (wenn der Benutzer selbst xmessage in seiner grafischen Umgebung ausführt, gibt es natürlich keine Fehlermeldung). Soll ich etwas mit der /home/user/.Xauthority lösen oder gibt es einen eleganteren Weg dafür? (Als DE kommt xfce zum Einsatz)
 
Moin,

welcher WM/DE zum Einsatz kommt, sollte keine Rolle spielen. Wenn du nur einen Benutzer hast, der an dem Rechner arbeitet, könntest du den Cronjob unter Verwendung von sudo als ebendieser User ausführen lassen. Bei einem Multiusersystem, geht es evtl. umgekehrt. Du lässt den Cronjob als root ausführen und scriptest dir etwas, das den eingeloggten User ausliest und als Variable an sudo übergibt, was dann wiederum xmessage aufruft.

HTH
 
Du koenntest z.B.
Code:
/usr/sbin/syspatch -c
als cronjob ausfuehren. Du bekommst dann eine Email, sobald neue patches zur Verfuegung stehen. Das funktioniert allerdings nur bei release/stable.
 
Mit sudo, bzw. doas, habe ich es versucht, doch auch wenn Cron das Skript als ein Benutzer ausführt, scheitert es standardmäßig am Display-Zugriff.

syspatch -c ist nicht ganz das was ich suche.

Ich habe es nun so gelöst, dass das Update-Skript beim Benutzer selbst liegt und beim Login geprüft wird, ob ein Update stattfinden kann/soll.
Ist zwar leider nicht über Cron, aber es läuft ganz gut. Verbesserungsvorschläge/Alternative Wege, gerne erwünscht.

ps: Trotz 'man ksh' erschließt sich mir noch nicht ganz der Sinn von:
Code:
# Turn off Strict Bourne shell mode.
set +o sh

Danke für eure bisherigen Antworten!


Code:
#!/bin/sh
#
# Verwendet nur 'syspatch', nicht 'pkg_add -u'!
#
# Skript-Location:              $HOME/system/update/update.sh
# /etc/doas.conf:               permit nopass user cmd syspatch
# $HOME/.xsession (am Beginn):  . $HOME/.profile
# $HOME/.profile:               /bin/sh -c '$HOME/system/update/update.sh'&
# 

# Turn off Strict Bourne shell mode.
set +o sh


# Update-Intervall und Datum-Logfile
_tage=3
_checkdates=check_dates.log

mkdir -p $HOME/system/update
cd $HOME/system/update


check_date() {
	local _intervall=$(($_tage*86400))

	[[ -s $_checkdates ]] || touch $_checkdates
	
	if [[ $(date +%s) -gt $(($(tail -n1 $_checkdates)+$_intervall)) ]]; then
		return
	else
		exit 0
	fi
}

# check_net wartet bis eine Internetverbindung besteht. Das Update-Skript
# blockiert nicht den Login-Vorgang, da es als Hintergrund-Prozess gestartet wird. 
check_net() {
	if [[ $(ping -c1 openbsd.org > /dev/null) -eq 0 ]]; then
		return
	else
		xterm -fullscreen -fa 'Monospace' -fs 13 -e ' \
		    printf "Das Update-Skript hat Probleme den Server 'openbsd.org' zu pingen!" \
		    read'
		    exit 1
	fi
}

check_update() {
	if [[ -n $(doas syspatch -c) ]]; then
		return
	else
		xmessage -timeout 3 -button '' -center 'Keine Updates vorhanden.'
		date +%s >> $_checkdates
		exit 0
	fi
}

check_user() {
	xmessage -buttons Ja,Nein -default Ja -center \
	    'Updates vorhanden. Jetzt herunterladen und installieren?'

	case $? in
	101)	return
		;;
	102)	exit 0
		;;
	esac
}

perform_update() {
	xterm -fullscreen -fa 'Monospace' -fs 13 -e ' \
	    printf "Beginne mit Update. Abbruch jederzeit mit Strg+c moeglich.\n\n"; \
	    doas syspatch; \
	    printf "\nFertig!"; read'
	date +%s >> $_checkdates
}


check_date
check_net
check_update
check_user
perform_update

exit 0
 
Zuletzt bearbeitet:
ps: Trotz 'man ksh' erschließt sich mir noch nicht ganz der Sinn von:
Code:
# Turn off Strict Bourne shell mode.
set +o sh
Ich kann mir vorstellen, dass das manual der Korn shell auch der falsche Ort zum suchen ist. Vor allem wenn du in der SheBang die bourne shell explizit angibst.
 
Stimmt SierraX!

Nachdem man hier nicht ewig lange seinen Beitrag editieren kann, hier eine aktualisierte und fehlerbefreite Version des Skripts:

Code:
#!/bin/sh
#
#	update.sh,v 1.01 2020/07/25 clearness
#
# Verwendet nur 'doas syspatch', nicht 'doas pkg_add -u'.
#
# Skript:                       $_wd/update.sh
# /etc/doas.conf:               permit nopass user cmd syspatch
# $HOME/.xsession (am Beginn):  . $HOME/.profile
# $HOME/.profile:
# /bin/sh -c 'cd <$_wd/Pfad/einfuegen>; ./update.sh 2>./debug.log 1>&2'&

# Turn off Strict Bourne shell mode.
set +o sh


###########################
# Debugging aktivieren
set -x

# Working Directory
_wd=$HOME/system/update

# Update-Intervall
_tage=3

# Datum-Logfile
_checkdates=check_dates.log
###########################


check_date() {
	local _intervall=$(($_tage*86400))

	[[ -s $_checkdates ]] || touch $_checkdates
	
	[[ $(date +%s) -gt $(($(tail -n1 $_checkdates)+$_intervall)) ]] || exit 0
}

# check_net wartet bis eine Internetverbindung besteht. Das Update-Skript
# blockiert nicht den Login-Vorgang, da es als Hintergrund-Prozess gestartet wird. 
check_net() {
	if [[ -n $(ping -c1 openbsd.org) ]]; then
		return
	else
		xterm -fullscreen -fa 'Monospace' -fs 13 -e ' \
		    printf "Das Update-Skript hat Probleme den Server 'openbsd.org' zu pingen!"; \
		    read'
		    exit 1
	fi
}

check_update() {
	if [[ -n $(doas syspatch -c) ]]; then
		return
	else
		xmessage -timeout 3 -button '' -center 'Keine Updates vorhanden.'
		date +%s >> $_checkdates
		exit 0
	fi
}

check_user() {
	xmessage -buttons Ja,Nein -default Ja -center \
	    'Updates vorhanden. Jetzt herunterladen und installieren?'

	case $? in
	101)	return
		;;
	102)	exit 0
		;;
	esac
}

perform_update() {
	xterm -fullscreen -fa 'Monospace' -fs 13 -e ' \
	    printf "Beginne mit Update. Abbruch jederzeit mit Strg+c moeglich.\n\n"; \
	    doas syspatch; \
	    printf "\nFertig!"; \
	    read'
	date +%s >> $_checkdates
}


mkdir -p $_wd
cd $_wd

check_date
check_net
check_update
check_user
perform_update

exit 0
 
.profile / .xsession
Nach dieser (https://www.reddit.com/r/openbsd/comments/c2rv41/confused_about_profile_and_xsession/ern5dn3/) kurzen Erklärung macht es Sinn, die Dinge für die grafische Sitzung nur in die $HOME/.xsession zu schreiben und die .profile für nicht grafische Anmeldungen zu nutzen bzw. um damit die enthaltenen Umgebungsvariablen zu setzen ( . $HOME/.profile am Beginn der .xsession schreiben).

Das zuletzt gepostete Skript sollte also besser von der .xsession ausgeführt werden
( /bin/sh -c 'cd <$_wd/Pfad/einfuegen>; ./update.sh 2>./debug.log 1>&2'& )


Um die Titelfrage zu beantworten:
Ein via Cron gestartetes Skript mit xmessage benötigt dafür einfach folgende gesetzte Umgebungsvariablen:

Code:
# jedenfalls im PATH: /usr/X11R6/bin für xmessage
PATH=$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/games
export PATH
export DISPLAY=:0
export XAUTHORITY=/home/user/.Xauthority

Denn die default Umgebungsvariablen von 'crontab -e -u user'-Nutzung sind verständlicherweise nur marginal:
Code:
LOGNAME=user
HOME=/var/log
PWD=/var/log
PATH=/bin:/sbin:/usr/bin:/usr/sbin
SHELL=/bin/sh
USER=user
 
Zurück
Oben