parse_cmdline is required for upcoming changes related to custom CPU types and live migration, and this way we can re-use existing code.
Provides the necessary infrastructure to parse QEMU /proc/.../cmdline. Changing the single user (check_running) is trivial too. Signed-off-by: Stefan Reiter <s.rei...@proxmox.com> --- PVE/QemuServer.pm | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 24bfd16..ac9abd0 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2952,8 +2952,8 @@ sub check_local_storage_availability { return $nodehash } -sub check_cmdline { - my ($pidfile, $pid) = @_; +sub parse_cmdline { + my ($pid) = @_; my $fh = IO::File->new("/proc/$pid/cmdline", "r"); if (defined($fh)) { @@ -2965,15 +2965,24 @@ sub check_cmdline { my $cmd = $param[0]; return if !$cmd || ($cmd !~ m|kvm$| && $cmd !~ m@(?:^|/)qemu-system-[^/]+$@); + my $phash = {}; + my $pending_cmd; for (my $i = 0; $i < scalar (@param); $i++) { my $p = $param[$i]; next if !$p; - if (($p eq '-pidfile') || ($p eq '--pidfile')) { - my $p = $param[$i+1]; - return 1 if $p && ($p eq $pidfile); - return undef; + + if ($p =~ m/^--?(.*)$/) { + if ($pending_cmd) { + $phash->{$pending_cmd} = 1; + } + $pending_cmd = $1; + } elsif ($pending_cmd) { + $phash->{$pending_cmd} = $p; + $pending_cmd = undef; } } + + return $phash; } return undef; } @@ -3000,7 +3009,8 @@ sub check_running { if ($line =~ m/^(\d+)$/) { my $pid = $1; - if (check_cmdline($pidfile, $pid)) { + my $cmdline = parse_cmdline($pid); + if ($cmdline && $cmdline->{pidfile} eq $pidfile) { if (my $pinfo = PVE::ProcFSTools::check_process_running($pid)) { return $pid; } -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel