Hi,
I am trying to execute a program with pipes to run a few basic commands by forking children. When I try to run commands in the child process without pipe, I am unable to run the command as execv fails. However for commands that are given with pipes execute successfully.
for example:
when I try to execute a command such as 'sftp', after searching all the available path in my $PATH variable, it does it not detect it under /usr/bin/sftp folder. But however if I give it as a part of the pipe such as 'pwd|sftp', it detects the presence of sftp in the /usr/bin folder and successfully executes it.
Can some one help me with what causes this wierd behaviour ?
NOTE:Both runs through the same part of the code to execute the command
I want to implement my own simple multi tasking shell in Unix which will take care of redirection (<, >, >>) and piping.
I am just unable to get a concrete idea of how exactly I have to start. I have several books...some are..
1. Maurice Bach- Design Of Unix Operating System
2. Richard... (3 Replies)
hello all
im trying to use in sun Solaris the information received from the top command
now i several machines that dont have install the top program so when im running the script im geting error
saying after im running this code :
set MemoryInfo = `top | grep Memory`
if (... (2 Replies)
i am having a weird error on mac os x running some shell scripts. i am a complete newbie at this and this question concerns 2 scripts. one of which a friend of mine wrote (videochecker.sh) a couple weeks ago and it's been running fine on another machine.
then last week i wrote capture.sh and it... (2 Replies)
Hi All,
Linux lxs3er06 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386 GNU/Linux
Issue:
While executing shell scripts in bash shell, following error messages are thrown:
rm:command not found
On doing little investigation, I added '/bin' to $PATH and on doing echo... (9 Replies)
Hello,
I like to begin with :wall:.. literally... It has been 4 days and I have no idea how to fix it.
Environment - AIX 5.3
I wrote a script to call on ssh to log into another box via PKA to do something else.
If I run the script on the terminal, it works 100%. If the SAP customised... (11 Replies)
I am running the export command within a view to use that value inside my build script. But while executing it it is saying "export command not found"
My code is as follows:
--------------------------
#!/bin/sh
user="test"
DIR="/bldtmp/"$user
VIEW="test.view1"
echo "TMPDIR before export... (4 Replies)
I want to know about the time command flow of execution.
I have a doubt in the time calculation for the command execution.
Whether the real time is sum of (time taken to open the unix window + execute the command given infront of the "time" command + close the unix window)
or Just the time... (1 Reply)
I have a running service which runs in background.
It execute shell commands by function system(cmd)
I need to report fail when command execution takes more than 60 seconds.
Parent doesn't need to wait for 60 seconds of time if the cmd execution completed already.
runCommand()
{
pid_t... (3 Replies)
Discussion started by: techmonk
3 Replies
LEARN ABOUT PHP
proc_open
PROC_OPEN(3) 1 PROC_OPEN(3)proc_open - Execute a command and open file pointers for input/output
SYNOPSIS
resource proc_open (string $cmd, array $descriptorspec, array &$pipes, [string $cwd], [array $env], [array $other_options])
DESCRIPTION proc_open(3) is similar to popen(3) but provides a much greater degree of control over the program execution.
PARAMETERS
o $cmd
- The command to execute
o $descriptorspec
- An indexed array where the key represents the descriptor number and the value represents how PHP will pass that descriptor to
the child process. 0 is stdin, 1 is stdout, while 2 is stderr. Each element can be:
oAn array describing the pipe to pass to the process. The first element is the descriptor type and the second element is an
option for the given type. Valid types are
pipe (the second element is either r to pass the read end of the pipe to the process, or w to pass the write end) and file
(the second element is a filename).
o A stream resource representing a real file descriptor (e.g. opened file, a socket,
STDIN).
The file descriptor numbers are not limited to 0, 1 and 2 - you may specify any valid file descriptor number and it will be passed
to the child process. This allows your script to interoperate with other scripts that run as "co-processes". In particular, this is
useful for passing passphrases to programs like PGP, GPG and openssl in a more secure manner. It is also useful for reading status
information provided by those programs on auxiliary file descriptors.
o $pipes
- Will be set to an indexed array of file pointers that correspond to PHP's end of any pipes that are created.
o $cwd
- The initial working dir for the command. This must be an absolute directory path, or NULL if you want to use the default value
(the working dir of the current PHP process)
o $env
- An array with the environment variables for the command that will be run, or NULL to use the same environment as the current PHP
process
o $other_options
- Allows you to specify additional options. Currently supported options include:
o suppress_errors (windows only): suppresses errors generated by this function when it's set to TRUE
o bypass_shell (windows only): bypass cmd.exe shell when set to TRUE
RETURN VALUES
Returns a resource representing the process, which should be freed using proc_close(3) when you are finished with it. On failure returns
FALSE.
CHANGELOG
+--------+---------------------------------------------------+
|Version | |
| | |
| | Description |
| | |
+--------+---------------------------------------------------+
| 5.2.1 | |
| | |
| | Added the bypass_shell option to the |
| | $other_options parameter. |
| | |
+--------+---------------------------------------------------+
EXAMPLES
Example #1
A proc_open(3) example
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value
";
}
?>
The above example will output something similar to:
Array
(
[some_option] => aeiou
[PWD] => /tmp
[SHLVL] => 1
[_] => /usr/local/bin/php
)
command returned 0
NOTES
Note
Windows compatibility: Descriptors beyond 2 (stderr) are made available to the child process as inheritable handles, but since the
Windows architecture does not associate file descriptor numbers with low-level handles, the child process does not (yet) have a
means of accessing those handles. Stdin, stdout and stderr work as expected.
Note
If you only need a uni-directional (one-way) process pipe, use popen(3) instead, as it is much easier to use.
SEE ALSO popen(3), exec(3), system(3), passthru(3), stream_select(3), The backtick operator.
PHP Documentation Group PROC_OPEN(3)