Hallo,
ich habe kleine Schwierigkeiten mit Perl/SH...
Beim Versuch, mein Shutdown-Skript für den Mt-Daapd-Server zu erweitern und c't-vdr konformer zu machen wird das Perl-Script nicht mehr ausgeführt.
Folgende Konstellation:
Beim shutdown wird das sh-Script aufgerufen (/usr/share/vdr/shutdown-hooks/S90.custom):
TRY_AGAIN=`perl /usr/local/scripts/get_shutdown_time.pl`;
echo "TRY_AGAIN=$TRY_AGAIN"
exit $TRY_AGAIN;
Die Ausgabe ist eine Variablendefinition (als String) , die vom aufrufenden Script dann ausgeführt wird und festlegt, ob direkt oder in TRY_AGAIN Minuten runtergefahren werden soll.
Das Script funktioniert auch prächtig:
#> sh /usr/share/vdr/shutdown-hooks/S90.custom
Auch, wenn ich es als Benutzer "vdr" ausführe:
#> sudo -u vdr sh /usr/share/vdr/shutdown-hooks/S90.custom
Im SysLog gibt er mir brav - wie im Perl-Skript vorgesehen - den Grund aus, warum er erst in 6 Minuten runterfahren will:
Oct 12 06:48:56 fliewatueuet shutdown-check: Überprüfe, ob noch Prozesse laufen oder Benutzer angemeldet sind.
Oct 12 06:48:57 fliewatueuet shutdown-check: Still active: SSH (root root ) Shutdown-Retry in 6 min
Wenn jetzt aber nicht ichim Terminal, sondern der VDR-shutdown-Prozess das sh-Script starte, dann wird der Code des sh-Scripts zwar ausgeführt, nicht aber das Perl-Script.
Ich habs über alle möglichen Wege versucht: er scheint gar nicht ins Perl-Script zu hüpfen.
Woran kann das liegen?
Noch kurz zur Umgebung:
#> ls -l /usr/share/vdr/shutdown-hooks/S90.custom
lrwxrwxrwx 1 root root 34 11. Okt 18:08 /usr/share/vdr/shutdown-hooks/S90.custom -> /etc/vdr/shutdown-hooks/S90.custom
#> ls -l /etc/vdr/shutdown-hooks/S90.custom
-rw-r--r-- 1 root root 850 12. Okt 06:44 /etc/vdr/shutdown-hooks/S90.custom
(Ich hatte hier die Rechte mal auf ugo+x gedreht, macht keinen unterschied)
#> ls -l /usr/local/scripts/get_shutdown_time.pl
-rwxr-xr-x 1 root root 6177 11. Okt 21:07 /usr/local/scripts/get_shutdown_time.pl
Und zu guter letzt - falls der Fehler wider Erwarten doch am Script selbst liegen sollte, das Script:
#!/usr/bin/perl
#use strict;
#use warnings;
# ---------------------------------------------------------------
# CONFIGURE HERE
# Path to SVDRPSEND for sending the Power-keypressed
my $svdrpsend="/usr/lib/vdr/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;
# Check for opened SSH-Connections
my $check_daap_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 $active_daap_users="";
my $logged_files="";
my $active_cmd="";
my $osd_text="";
qx{$log "Überprüfe, ob noch Prozesse laufen oder Benutzer angemeldet sind."};
# 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 -q d 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_daap_users ne ""){
$logtext.="MP3-Streaming-Clienten (".$active_daap_users.") ";
$osd_text.=" MP3-Streaming ";
}
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"};
$response.=qx{$svdrpsend HITK USR5}
}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='';
my $pid =0;
for (@CMD_LST){
#my $pid=qx{pidof $_ 2>&1};
#ungetestete verbesserung:
$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='';
my $active_samba_users ='';
if ($check_smb_conn=="1"){
$shellcmd="smbstatus -b 2>/tmp/smberror.txt | sed -e '/(^ERROR.*)|(^messaging*.)/d' ";
$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 2>/tmp/smberror.txt | 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[6]." ";
}
}
}
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 ($check_daap_conn=="1"){
$shellcmd='netstat | grep "daap"';
$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_daap_users.=$row_cols[4]." ";
}
}
}
if ($logins>0){$TRY_AGAIN=$try_again_time;}
return $TRY_AGAIN;
}
Display More
Für jeden Hinweis dankbar,
Hannes