[pve-devel] [PATCH installer v2 4/6] sys: command: allow terminating the process early from log subroutine
Christoph Heiss
c.heiss at proxmox.com
Tue Feb 13 16:14:01 CET 2024
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.heiss at 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
More information about the pve-devel
mailing list