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:
- my $svdrpsend="/usr/lib/vdr/svdrpsend.pl";
- my $pathOfThisScript="/usr/local/scripts/shutdown_check.pl";
- my @CMD_LST=("noad","transcode","vcdimager","mencoder","tosvcd","lame","tcmplex","mv","pes2aud_es","tar");
- my $try_again_time=6;
- my $OSD_message=1;
- my $check_smb_conn=1;
- my $check_smb_files=1;
- my $check_ssh_conn=1;
- my $check_daap_conn=1;
- 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."};
- 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){
-
-
- $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"};
-
- }
- print $TRY_AGAIN;
- sub FindActiveProcesses{
- my $TRY_AGAIN=0;
- my $response='';
- my $logtext='';
- my $pid =0;
- for (@CMD_LST){
-
-
- $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;
- }
Alles anzeigen
Für jeden Hinweis dankbar,
Hannes