Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:通过使用proc_open(“ssh hostname';tail-F~somefile';”实现死锁_Php_Ssh_Proc Open - Fatal编程技术网

PHP:通过使用proc_open(“ssh hostname';tail-F~somefile';”实现死锁

PHP:通过使用proc_open(“ssh hostname';tail-F~somefile';”实现死锁,php,ssh,proc-open,Php,Ssh,Proc Open,我需要通过php(使用phpunit)通过ssh跟踪文件状态。但当我尝试启动此代码时: $descriptorspec = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w'), ); $cmd = "ssh hostname 'tail -F ~/test.file'"; $proc = proc_open($cmd, $descriptorspec,

我需要通过php(使用phpunit)通过ssh跟踪文件状态。但当我尝试启动此代码时:

$descriptorspec = array(
  0 => array('pipe', 'r'),
  1 => array('pipe', 'w'),
  2 => array('pipe', 'w'),
);

$cmd = "ssh hostname 'tail -F ~/test.file'";

$proc = proc_open($cmd, $descriptorspec, $pipes, null);

$str = fgets($pipes[1]);
echo $str;
if (!fclose($pipes[0])) {
  throw new Exception("Can't close pipe 0");
}
if (!fclose($pipes[1])) {
  throw new Exception("pipe 1");
}
if (!fclose($pipes[2])) {
  throw new Exception("pipe 2");
}
$res = proc_close($proc);
什么也没发生-没有输出,我猜死锁被破坏了:脚本不会退出。
你有什么想法吗?还是建议?

tail-F实际上并没有“结束”——它只是在输出可用时继续转储输出。这可能就是问题所在。它在fgets()上阻塞

我的建议是:使用。例如


虽然从实施的角度来看,现在。。。它看起来也没有为你提供任何提前退出的机制。如果像“如果packet\u handler返回false,那么exec()停止运行”之类的话,那就太好了


我想你可以用
->setTimeout()

ty来代替这个答案。我猜是我的错,我认为“proc_open”执行命令时使用了类似于守护该命令的东西。为此,您可能必须执行类似于
nohup
的操作。但即便如此,我的期望是,无论是OpenSSH还是phpseclib,它们都会立即返回,而不会给您任何类型的输出。。我一直在谷歌上搜索解决方案,我看到的都是你那一模一样的愚蠢的复制粘贴答案。。这并不适用于任何地方。@Pamblam-伙计,你在评论一篇两年前的帖子。下一步是什么?也许你应该去发帖告诉我应该升级,因为我正在使用的图书馆已经过时三年半了(这恰好是那篇帖子的年代)@Pamblam-此外,我的答案并不妨碍其他人发布他们自己的“更好”答案。如果你认为一个问题没有令人满意的答案,那么你可以悬赏这个问题以引起人们的注意,然后悬赏这个答案。
<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

function packet_handler($str)
{
    echo $str;
}

$ssh->exec('tail -F ~/test.file', 'packet_handler');
?>