The branch, build-main has been updated via afeeb580215270c4a1658b6773c8cb2ff6d4e2ed (commit) from dfe76c81c09a38819bac236020c2b49eeaede246 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: debian/changelog | 2 ++ x2goserver/lib/x2golistsessions_sql | 16 +++++++++++++++- x2goserver/sbin/x2gocleansessions | 29 +++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) The diff of changes is: diff --git a/debian/changelog b/debian/changelog index cadd8be..64f8ff5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,8 @@ x2goserver (4.0.0.3-0~x2go1) UNRELEASED; urgency=low in the session DB. - Add support for terminating sessions via the session DB. - Raise the frequency of the x2gocleansessions loop to every two seconds. + - Send SIGKILL to blocked X-Server (x2goagent) processes, if they do not + disappear within 20secs. (Fixes: #32). -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Sun, 19 May 2013 15:02:53 +0200 diff --git a/x2goserver/lib/x2golistsessions_sql b/x2goserver/lib/x2golistsessions_sql index 2957437..b667b4f 100755 --- a/x2goserver/lib/x2golistsessions_sql +++ b/x2goserver/lib/x2golistsessions_sql @@ -31,6 +31,20 @@ openlog($0,'cons,pid','user'); setlogmask( LOG_UPTO(x2gologlevel()) ); +sub check_pid +{ + my $pid=shift; + my $sess=shift; + open (F,"</proc/$pid/cmdline") or return 0; + my $text=<F>; + close (F); + if ($text =~ m/$sess/) + { + return 1; + } + return 0; +} + my $serv=shift; my @array; if($serv eq "--all-servers") @@ -45,7 +59,7 @@ my $i; for ( $i=0;$i<@array;$i++) { my @ln=split('\|',@array[$i]); - if (@ln[4] eq "F") + if ((@ln[4] eq "F") && (check_pid(@ln[0], @ln[1])) { my $sid = @ln[1]; dbsys_rmsessionsroot($sid); diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index ca4f95a..1548e2b 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -118,18 +118,43 @@ elsif ($pid == 0 ) $SIG{TERM}=\&catch_term; $SIG{CHLD} = sub { wait }; + my %blocked_sessions = (); + while(sleep 2) { my $outp=`$x2go_lib_path/x2golistsessions_sql $serv 2>/dev/null`; my @outp=split("\n","$outp"); + + # forget earlier remembered blocked sessions + while ( my ($session, $blocked_time) = each(%blocked_sessions) ) { + if (! join(',', @outp)=~m/$session/) + { + delete $blocked_sessions{$session} + } + } + for (my $i=0;$i<@outp;$i++) { my @sinfo=split('\\|',"@outp[$i]"); if (@sinfo[4]eq 'F') { + syslog('debug', "@sinfo[1] is blocked"); - syslog('debug', "@sinfo[1]: unmounting all shares"); - system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); + if defined $hash{ $key } + { + $blocked_sessions{@sinfo[1]} += 2; + if ($blocked_sessions{@sinfo[1]} >= 20) { + { + # send SIGKILL to dangling X-server processes + syslog('warning', "@sinfo[1]: found stale X-server process (@sinfo[0]), sending SIGKILL"); + qw(kill -9 @sinfo[0]) + } + } else { + $blocked_sessions{@sinfo[1]} = 0; + syslog('debug', "@sinfo[1]: unmounting all shares"); + system( "su @sinfo[11] -c \"export HOSTNAME && x2goumount-session @sinfo[1]\" 2> /dev/null"); + } + } elsif (! check_pid (@sinfo[0],@sinfo[1],@sinfo[12])) { hooks/post-receive -- x2goserver.git (X2Go Server) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "x2goserver.git" (X2Go Server).