2013-11-08 3 views
1

Случается, что мне нужно отслеживать статус файла через ssh по php (используя phpunit). Но когда я пытаюсь запустить этот код:PHP: Тупик через использование proc_open ("ssh hostname 'tail -F ~ somefile'")

$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); 

ничего не происходит - нет выхода, и я думаю, тупиковая exucuted: скрипт не выходит. Есть идеи? или предложения?

ответ

0

tail -F не на самом деле «конец» - он просто продолжает выгружать выходные данные, когда он становится доступным. Вероятно, это проблема. Это блокирует fgets().

Моя рекомендация: используйте phpseclib, a pure PHP SSH2 implementation. например.

<?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'); 
?> 

Хотя, глядя на реализацию, сейчас ... это не выглядит, как она предоставляет вам с любым механизмом преждевременного выхода либо. Было бы неплохо, если бы это было похоже на «если пакет_handler возвращает false, а exec() перестает работать» или что-то в этом роде.

Я предполагаю, что вы можете использовать ->setTimeout().

+0

ty для ответа. По-моему, я виноват в том, что я думал, что «proc_open» выполняет команду с чем-то вроде демонализации этой команды. – user2968022

+0

Для этого вам, вероятно, придется делать что-то вроде «nohup». Но даже тогда я ожидаю, что с OpenSSH или phpseclib оба сразу вернутся, не давая вам никакого выхода. – neubert

+0

чувак прекратил публиковать это. Я искал поисковую систему для решения, и все, что я вижу, тот же самый тупой, скопированный и вставленный ответ .. это не работает повсюду. –