If the logging subroutine $func returns CMD_FINISHED after processing a line, the running subprocess is killed early. This mechanism can be used when e.g. only a certain part of the output of a (long-running) command is needed, avoiding the extra time it would take the command to finish properly.
This is done in a entirely backwards-compatible way, i.e. existing usages don't need any modification. Signed-off-by: Christoph Heiss <c.he...@proxmox.com> --- Changes since v1: * introduced constant for return value (thanks Thomas!) * added documentation Proxmox/Sys/Command.pm | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Proxmox/Sys/Command.pm b/Proxmox/Sys/Command.pm index 6389b17..36e99c1 100644 --- a/Proxmox/Sys/Command.pm +++ b/Proxmox/Sys/Command.pm @@ -15,7 +15,9 @@ use Proxmox::Log; use Proxmox::UI; use base qw(Exporter); -our @EXPORT_OK = qw(run_command syscmd); +our @EXPORT_OK = qw(run_command syscmd CMD_FINISHED); + +use constant CMD_FINISHED => 1; my sub shellquote { my $str = shift; @@ -79,7 +81,8 @@ sub syscmd { # # Arguments: # * $cmd - The command to run, either a single string or array with individual arguments -# * $func - Logging subroutine to call, receives both stdout and stderr +# * $func - Logging subroutine to call, receives both stdout and stderr. Might return CMD_FINISHED +# to exit early and ignore the rest of the process output. # * $input - Stdin contents for the spawned subprocess # * $noout - Whether to append any process output to the return value sub run_command { @@ -163,7 +166,13 @@ sub run_command { $logout .= $buf; while ($logout =~ s/^([^\010\r\n]*)(\r|\n|(\010)+|\r\n)//s) { my $line = $1; - $func->($line) if $func; + if ($func) { + my $ret = $func->($line); + if (defined($ret) && $ret == CMD_FINISHED) { + wait_for_process($pid, kill => 1); + return $ostream; + } + }; } } elsif ($h eq $error) { -- 2.43.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel