Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

how do i run a shell command without waiting for the output

by gabrielsousa (Sexton)
on Apr 24, 2017 at 11:48 UTC ( #1188755=perlquestion: print w/replies, xml ) Need Help??

gabrielsousa has asked for the wisdom of the Perl Monks concerning the following question:

how do i run a shell command without waiting for the output.
is this rigth ?
my $pid; if (defined ($pid=fork)) { if (!$pid) { #system qq(curl -H "Content-Type: application/json" -X POST -d '$datac +url' http://192.168.125.169/index.php/itsqd/v1/nmessage); exec qq(curl -H "Content-Type: application/json" -X POST -d '$datacurl +' http://192.168.125.169/index.php/itsqd/v1/nmessage); } }

Replies are listed 'Best First'.
Re: how do i run a shell command without waiting for the output
by shmem (Chancellor) on Apr 24, 2017 at 11:58 UTC
    is this rigth ?

    Yes - if, as your code shows, you are using exec. You can use system as well inside the forked process, which allows you to check the return code; you have to exit after that. But you can also do without the fork, since system does an implicit fork, and spawn the process via /bin/sh in the background:

    system qq(curl -H "Content-Type: application/json" -X POST -d '$datacu +rl' http://192.168.125.169/index.php/itsqd/v1/nmessage &); # <--- not +ice the ampersand

    This lets you check - again, via the return code, which should be 0 on success - whether the shell succeeded spawning curl. If so, the shell returns immediately, and the curl process runs in the background. Otherwise the shell exits with a non-zero value, which is returned by system.

    perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

      Unfortunately, "the" shell is everything but a single, consistent definition. Perl invokes the default shell, which can and does vary wildly from platform to platform and from system version to system version.

      More details:

      Of course, simply appending a space and an ampersand to a shell command to make the shell start a "background" process is not portable. Even on shells that support backgrounding, it might not work due to pipes or the like used in the command.

      And finally, shelling out to start curl just wastes time and resources. Perl can do HTTP requests just fine thanks to LWP::UserAgent, Net::HTTP::Client, and various other modules. Plus, there are at least three modules that use libcurl as backend: Net::Curl, WWW::Curl, and LWP::Curl.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

        Thanks for your post which contains the missing bits for the OP to be fully answered. ++afoken

        perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
Re: how do i run a shell command without waiting for the output
by james28909 (Deacon) on Apr 24, 2017 at 18:04 UTC
    Another way is to:
    system (1, commands) or die $!;

      Another way is to:

      That bit of wisdom comes from perlport which explains it isn't portable

      Proc::Background is more portable

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1188755]
Approved by shmem
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (4)
As of 2021-09-28 18:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?