Hi,
I am struggling to find a way to kill a proc_open() stream if it remains
idle (hangs). Specifically, I am opening an SSH connection up and running a
remote command - all from a PHP script run from the shell. Under the rare
circumstance that my passwordless authentication fails (ie: it sits there
waiting for a password), I want to be able to 1) check to see if this is the
case 2) kill the stream 3) move on to other tasks. My "solution" (it
doesn't work) has been to set blocking to false, and check to see if it
continues looping in the fread() for 5 seconds. If the loop is > 5 seconds,
I try to send a CTRL-C to the opened ssh command, break out of the loop and
move on. But, the CTRL-C doesn't kill the ssh command, and the script gets
stuck (ie: it doesn't do it's var_export) until I manually CTRL-C from the
shell. looks like this so far:
$spec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/tmp/error-output.txt", "a")
);
$process = proc_open(''ssh somehost someremotecommand';', $spec, $pipes);
if (is_resource($process)) {
stream_set_blocking($pipes[1], false);
stream_set_blocking($pipes[0], false);
$contents = '';
$time = time();
while (!feof($pipes[1])) {
$contents .= fread($pipes[1], 8192);
if (time() - $time > 5) {
// send ctrl-c
fwrite($pipes[0], chr(4));
break;
}
}
fclose($pipes[0]);
fclose($pipes[1]);
$return_value = proc_close($process);
}
var_export($contents);
die();
Any ideas on how I can do this?
CONFIDENTIALITY NOTICE
This message contains confidential information intended only for the use of
the individual or entity named as recipient. Any dissemination, distribution
or copying of this communication by anyone other than the intended recipient
is strictly prohibited. If you have received this message in error, please
immediately notify us and delete your copy. Thank you.
AVIS DE CONFIDENTIALIT�
Les informations contenues aux pr�sentes sont de nature privil�gi�e et
confidentielle. Elles ne peuvent �tre utilis�es que par la personne ou
l'entit� dont le nom para�t comme destinataire. Si le lecteur du pr�sent
message n'est pas le destinataire pr�vu, il est par les pr�sentes pri� de
noter qu'il est strictement interdit de divulguer, de distribuer ou de
copier ce message. Si ce message vous a �t� transmis par m�garde, veuillez
nous en aviser imm�diatement et supprimer votre copie. Merci.