I wonder if perhaps I haven't been clear in the problem.

In the provided code example:
     my $cmd = "/bin/stdbuf";
     my @args = qw@ -o1 -e1 /usr/bin/speedtest-cli@;

     print '<pre class="alert">';    <-- appears in the HTML output.
     my $pid = open3(0, \*READER, 0, $cmd, @args);
     while ( my $output = <READER> ) {
           print $output;       <-- This never outputs anything.
     }
     print "Speed test complete.</pre>"; <-- appears in the HTML output.
     waitpid $pid,0;

If I was to guess, it seems like an interaction with open3 and modperl.

https://perldoc.perl.org/IPC::Open3

The syntax is basically:

my $pid = open3( <input>, <stdout>, <stderr>, $cmd, @args );

If I understand it right, I give it a filehandle - which I then read from. The executed command is then:

/bin/stdbuf -o1 -e1 /usr/bin/speedtest-cli

The inclusion of using stdbuf with these options are to stream the ouput line after line, and not whatever terminal buffer is in place that will return the output in a chunk.

However, all output from running the command ends up in the apache logs.

That means that <READER> never gets anything, and therefore the print is never called.

Does that make more sense?


On 14/5/24 12:46, Joseph He wrote:
Steven, you need to use those mod-perl libraries to handle the web request and to generate the response.

https://perl.apache.org/docs/2.0/user/intro/start_fast.html <https://perl.apache.org/docs/2.0/user/intro/start_fast.html>

Scroll down to the bottom, you can see how to output the content.

Cheers,
Joseph


On Mon, May 13, 2024 at 9:35 PM Steven Haigh via modperl <modperl@perl.apache.org <mailto:modperl@perl.apache.org>> wrote:

    That being said, is there a way to output to the web page in this
    scenario?

    On 14/5/24 12:15, Joseph He wrote:
     > CGI script runs on its own process. mod-perl basically wraps CGI
    script
     > into apache process, that is why its output is automatically
    going to
     > Apache log.
     >
     > On Mon, May 13, 2024 at 1:53 AM Steven Haigh via modperl
     > <modperl@perl.apache.org <mailto:modperl@perl.apache.org>
    <mailto:modperl@perl.apache.org <mailto:modperl@perl.apache.org>>>
    wrote:
     >
     >     Hi all,
     >
     >     I'm playing around with mod_perl on apache on docker - and
    now I've
     >     finally got all the module issues sorted, I'm trying to
    figure out why
     >     when using mod_perl, the output of scripts ends up in the
    apache logs.
     >
     >     The following configuration works, and the output of shelled
    scripts
     >     works as expected:
     >
     >     <Location />
     >           DirectoryIndex index.pl <http://index.pl>
    <http://index.pl <http://index.pl>> index.html
     >           AddHandler cgi-script .pl
     >           Options +Indexes +FollowSymLinks +ExecCGI
     >           Require all granted
     >     </Location>
     >
     >     If I change this to use mod_perl, all output from scripts run
    in web
     >     pages ends up in the apache log:
     >
     >     <Location />
     >           DirectoryIndex index.pl <http://index.pl>
    <http://index.pl <http://index.pl>> index.html
     >           AddHandler perl-script .pl
     >           Options +Indexes +FollowSymLinks +ExecCGI
     >           Require all granted
     >     </Location>
     >
     >     The perl code I'm using in the web page is as follows:
     >     my $cmd = "/bin/stdbuf";
     >     my @args = qw@ -o1 -e1 /usr/bin/speedtest-cli@;
     >
     >     print '<pre class="alert">';
     >     my $pid = open3(0, \*READER, 0, $cmd, @args);
     >     while ( my $output = <READER> ) {
     >           print $output;
     >     }
     >     print "Speed test complete.</pre>";
     >     waitpid $pid,0;
     >
     >     Does anyone have any clues as to why STDOUT would end up in
    the apache
     >     log and not in the web page being served when using
    perl-script as the
     >     handler?
     >
     >     --
     >     Steven Haigh
     >
     >     📧 net...@crc.id.au <mailto:net...@crc.id.au>
    <mailto:net...@crc.id.au <mailto:net...@crc.id.au>>
     >     💻 https://crc.id.au <https://crc.id.au> <https://crc.id.au
    <https://crc.id.au>>
     >
     >

-- Steven Haigh

    📧 net...@crc.id.au <mailto:net...@crc.id.au>
    💻 https://crc.id.au <https://crc.id.au>


--
Steven Haigh

📧 net...@crc.id.au
💻 https://crc.id.au

Reply via email to