Hallo,
ich hatte mir ja schon das Shutdown-Skript soweit erweitert, dass es auch abfragt, ob noch Benutzer eingeloggt sind, und ggf in X Minuten wieder versucht. Weil der erneute Versuch aber ueber "$vdrpsend HITK POWER" lief hatte ich immer die haessliche Meldung im OSD und Wiedergaben wurden abgebrochen.
Ich hab jetzt das Skript so umgebaut, das zuerst abgefragt wird, ob ueberhaupt runtergefahren werden kann - und nur fuer den Fall das es o.k. ist "$vdrpsend HITK POWER" abgeschickt wird.
Das ganze setzt sich zusammen aus einem Script "/usr/local/scripts/shutdown_check.pl", das checkt, ob Benutzer und Prozesse aktiv sind, die den Shutdown verhindern und die Minuten zurueckgeben, in denen das Skript es selbst erneut testet (ruft sich selbst wieder auf).
EDIT aktuelles Script s.u. /EDIT
Wenn der Shutdown stattfinden kann, drueckt das Skript die POWER-Taste und das normale Shutdown-Skript wird gestartet. Hieraus habe ich die Prozess-Abfrage entfernt. Das normale Shutdown-Script ruft erneut das obige Script auf (ist ein bisschen unsauber, muss aber sein, weil der Shutdown ja auch erstmals ausgefuehrt werden kann) und gibt schliesslich das eigentliche Shutdown-Kommando:
EDIT aktuelles Script s.u. /EDIT
Um aus dem Terminal einen sauberen Shutdown zu ermoeglichen werden Aliasse in die .bashrc geschrieben:
# use shutdownscript instead. shutdownallowed needed to allow shutdown although ssh-logins active
alias shutdown='echo "YES">/tmp/shutdownallowed && /usr/lib/vdrdevel/svdrpsend.pl HITK Power #'
#in case of emergency:
alias restart='sudo /sbin/shutdown -r now'
alias shutdownforce='sudo /sbin/shutdown -h now'
Da normalerweise kein Shutdown moeglich ist, wenn nur SSH-Logins offen sind wird hier noch ein File beschrieben, was dem o.g. Script hierzu das o.k. gibt.
Vielleicht kann das ja wer gebrauchen, laeuft bei mir (endlich) tadellos...
Hannes
EDIT:
Anbei die aktuellsten Versionen. Jetzt kann man auch die Zeitspanne waehlen, in der es wieder versucht werden soll und OSD-Messages aktivieren / deaktivieren.
Anbei meine aktuelle /usr/lib/vdrdevel/vdrdevel-shutdown
#!/bin/sh
#
# VDR Shutdown Script - Tobias Grimm <tg@e-tobi.net>
# slightly modified by [EMAIL]hannsens@macnews.de[/EMAIL]
# -------------------
#
# see README.Debian
#
. /usr/lib/vdrdevel/config-loader.sh
SHUTDOWN_HOOKS_DIR=/usr/share/vdrdevel/shutdown-hooks/
log="logger -t vdrdevel-shutdown"
svdrpsend="/usr/lib/vdrdevel/svdrpsend.pl"
shutdowntest="/usr/local/scripts/shutdown_check.pl"
osdmsg()
{
# OSD message must be deferred, to let VDR display it AFTER the
# shutdown script has been executed
sleep 2
$svdrpsend MESG "$1"
}
TRY_AGAIN=`perl $shutdowntest`
if [ $TRY_AGAIN -lt 1 ]
then
$log "no shutdown-delay found by shutdown_check-script"
shutdownhooks=`find $SHUTDOWN_HOOKS_DIR -maxdepth 1 -xtype f | sort`
for shutdownhook in $shutdownhooks; do
TRY_AGAIN=0
if [ -x $shutdownhook ]; then
$log "executing $shutdownhook"
result_data=`$shutdownhook "$@"`
else
$log "executing $shutdownhook as shell script"
result_data=`/bin/sh $shutdownhook "$@"`
fi
result=$?
eval $result_data
if [ $result -ne 0 ] ; then
$log "Shutdown aborted by $shutdownhook with exitcode $result"
osdmsg "Shutdown abgebrochen / Shutdown aborted!" &
[ -z "$ABORT_MESSAGE" ] || osdmsg "$ABORT_MESSAGE" &
exit $result
fi
if [ $TRY_AGAIN -gt 0 ]
then
$log "$shutdownhook requests to try again in $TRY_AGAIN minutes"
echo "perl $shutdowntest" | at now + $TRY_AGAIN minutes
osdmsg "Shutdown aborted. Retry in $TRY_AGAIN minutes." &
exit 0
fi
done
eval $SHUTDOWNCMD
fi
Display More
Und das andere Script: (/usr/local/scripts/shutdown_check.pl ) unten nochmal als Download
#!/usr/bin/perl -w
use strict;
use warnings;
# ---------------------------------------------------------------
# CONFIGURE HERE
# Path to SVDRPSEND for sending the Power-keypressed
my $svdrpsend="/usr/lib/vdrdevel/svdrpsend.pl";
# when retrying this script will again be executed in 5 minutes
my $pathOfThisScript="/usr/local/scripts/shutdown_check.pl";
# List all commands here, that should defer shutdown
my @CMD_LST=("noad","transcode","vcdimager","mencoder","tosvcd","lame","tcmplex","mv","pes2aud_es","tar");
# Try to shutdown each XX minutes if still users logged in / processes active
my $try_again_time=6;
# Display a Message on OSD
my $OSD_message=1;
# Check for opened SMB-Connections (1 means check / 0 means don't)
my $check_smb_conn=1;
# Check for opened SMB-Files
my $check_smb_files=1;
# Check for opened SSH-Connections
my $check_ssh_conn=1;
# ---------------------------------------------------------------
# no need to edit things below
# initial vars
my $log="logger -t shutdown-check";
my $logtext="";
my $logins=0;
my $row=0;
my $col=0;
my $shellcmd='';
my $shelloutput='';
my $shutdown='';
my @output_row=();
my @row_cols=();
my $TRY_AGAIN=0;
my $shutdown_later='';
my $response='';
my $active_ssh_users="";
my $active_samba_users="";
my $logged_files="";
my $active_cmd="";
my $osd_text="";
# first see, if shutdown is forces by setting export-var to "YES" (if shutdown is typed in Terminal)
open(DATEI, "</tmp/shutdownallowed");
while(! eof(DATEI)) {
$shutdown.= getc(DATEI);
}
close(DATEI);
$shutdown =~ s/\n//g;
if ($shutdown ne "YES"){
$TRY_AGAIN+=FindActiveUsers();
}else{
$response.=qx{$log "Shutdown forced by User, so Login/SSH-Sessions will be ignored"};
}
$TRY_AGAIN+=FindActiveProcesses();
if ($TRY_AGAIN>0){
$shutdown_later='echo "'.$pathOfThisScript.'" | at now + '.$TRY_AGAIN.' minutes 2>/dev/null';
$response.=qx{$shutdown_later};
$logtext="Still active: ";
$osd_text='Shutdown delayed ( ';
if ($active_ssh_users ne ""){
$logtext.="SSH (".$active_ssh_users.") ";
$osd_text.=" SSH ";
}
if ($active_samba_users ne ""){
$logtext.="SMB (".$active_samba_users.") ";
$osd_text.=" SMB-Session ";
}
if ($active_cmd ne ""){
$logtext.="processes (".$active_cmd.") ";
$osd_text.=" procs ";
}
if ($logged_files ne ""){
$logtext.="opened smb-files (".$logged_files.") ";
$osd_text.=" SMB-activity ";
}
if ($TRY_AGAIN>$try_again_time) {$TRY_AGAIN=$try_again_time;}
$osd_text.=") retry in 6m";
if ($OSD_message==1) {$response.=qx{$svdrpsend MESG "$osd_text"};}
$response.=qx{$log "$logtext Shutdown-Retry in $TRY_AGAIN min"};
}else{
$response.=qx{$log "No shutdown-delay by users or processes, so shutdown-command will be sent"};
$response.=qx{$svdrpsend HITK Power };
}
print $TRY_AGAIN;
sub FindActiveProcesses{
my $TRY_AGAIN=0;
my $response='';
my $logtext='';
for (@CMD_LST){
#my $pid=qx{pidof $_ 2>&1};
#ungetestete verbesserung:
my $pid=qx{pidof $_ 2>&1 | tr -d '\r' | tr -d '\n'}
if ($pid ne "") {
if ($active_cmd ne '') {$active_cmd.=', ';}
$active_cmd.= $_;
$TRY_AGAIN=$try_again_time;
}
}
return $TRY_AGAIN;
}
sub FindActiveUsers{
my $TRY_AGAIN=0;
my $response='';
if ($check_smb_conn=="1"){
$shellcmd="smbstatus -b";
$shelloutput=qx{$shellcmd 2>&1};
if ($shelloutput) {
@output_row=split ( /\n/, $shelloutput);
foreach (@output_row) {
$col=0;
$row++;
if ($row>4){
while ($_=~ / /) {$_ =~ s/ / /g;}
@row_cols=split ( / /, $_);
$active_samba_users.=$row_cols[1]." ";
$logins++;
}
}
}
}
if ($check_smb_files=="1"){
$shellcmd='smbstatus -L | grep -v "No locked files" | grep -v "Locked files" | grep -v "Pid" | grep -v "\-\-"';
$shelloutput=qx{$shellcmd 2>&1};
if ($shelloutput) {
@output_row=split ( /\n/, $shelloutput);
foreach (@output_row) {
$col=0;
while ($_=~ / /) {$_ =~ s/ / /g;}
@row_cols=split ( / /, $_);
$logins++;
$logged_files.=$row_cols[5]." ";
}
}
}
if ($check_ssh_conn=="1"){
$shellcmd='ps -ef | grep "\-bash" | grep -v grep';
$shelloutput=qx{$shellcmd 2>&1};
if ($shelloutput) {
@output_row=split ( /\n/, $shelloutput);
foreach (@output_row) {
$col=0;
while ($_=~ / /) {$_ =~ s/ / /g;}
@row_cols=split ( / /, $_);
$logins++;
$active_ssh_users.=$row_cols[0]." ";
}
}
}
if ($logins>0){$TRY_AGAIN=$try_again_time;}
return $TRY_AGAIN;
}
Display More
EDIT:
Jetzt mit Test, ob SMB-Datei-Aktivitäten vorhanden sind. Dann koennt Ihr ggf. den Verbindungscheck ausschalten.
/EDIT