#!/bin/sh # Dieses Skript versucht so lange den Rechner herunter zu fahren, bis who keine # User mehr anzeigt, und keine screen Sessions mehr gefunden werden. # Wenn die Zeit erreicht ist, zu der der Rechner laufen sollte, # beendet sich das Skript ohne den Rechner herunterzufahren. # Zeitpunkt ab dem der Rechner an sein sollte: SHIFTSTART='10' # Zeitpunkt ab dem der Rechner heruntergefahren werden sollte: SHIFTEND='20' # shutdown Befehl SHUTDOWN='/sbin/shutdown -h now' # soll goodnight sagen was es tut? DEBUG="YES" # shift is considered started when the machine should run # returns 0 (==true) if the shift has started shifthasstarted () { HOUR=$(date "+%k") if [ ${HOUR} -lt ${SHIFTEND} -a ${HOUR} -ge ${SHIFTSTART} ]; then return 0 else return 1 fi } # returns 0 if somebody is logged in somebodyisloggedin () { r1=$(w -h | wc -l) # local users r2=$(ps ax | grep -e tmux -e SCREEN -e 'sshd:' | grep -v grep | wc -l) # remote users return $(( ! (r1 + r2) )) } # only echos parameter if DEBUG is set to "YES" debug () { if [ $DEBUG = "YES" ]; then echo "$@" fi } # Warten, bis alle Benutzer ausgeloggt debug -n "$(date +'[%F %T]') " debug -n "waiting for all sessions to end " while somebodyisloggedin && ! shifthasstarted ; do debug -n "." sleep 300 done debug "" # Wenn es ausserhalb der Arbeitszeit ist herunterfahren. debug -n "$(date +'[%F %T]') " debug "Shift starts at ${SHIFTSTART} and ends at ${SHIFTEND}" debug -n "$(date +'[%F %T]') " debug -n "Therefore I am " if shifthasstarted ; then debug "cancelling shutdown because it's my shift" else debug "shutting down after an uptime of $(uptime | awk '{print $1}')" ${SHUTDOWN} fi exit 0