Эта тема на forum.dklab.ru


Shira: ssh2_connect close or timeout
Всех приветствую!

После использования ssh2_connect соединение с шелом не разрывается(нет соответствующей ф-ции), не поддается никаким таймаутам...... Т.е. после работы скрипта соединение остается! Лимит на кол-во соединений - 3, скрипт запускаетя каждый час + его могут запускать вручную, т.е. лимита полюбому не хватает, пока помогает тока перезагрузка апача....

Есть варианты как решить эту проблему?
Shira:
Уважаемый, Александр Михалицын, или я чего то не понимаю, или тот код, что Вы привели немного(а если быть точнее, то СОВСЕМ) не о том. Мне нужно пренудительный разрыв соединения...... а не реагирование на дисконнект....!
Александр Михалицын:
Shira,
я убрал. Сначала не туда посмотрел.
Александр Михалицын:
Попробуйте вот такой код:

@fclose($connect);
unset($connect);

Shira:
Александр Михалицын, к сожалению не помогает, fclose пробовал уже...... unset - аналогично.
Александр Михалицын:
Shira,
не очень хочется гадать, завтра погуглю еще (-;, но попробуйте копнуть в сторону ssh2_exec и какой-нибудь команды для разрыва соединения.
Миша Спларов:
Не пробовали ssh2_exec($connection, 'exit');?
Shira:
пробовал и exit, и logout
Миша Спларов:
Тогда никак: http://pecl.php.net/bugs/bug.php?id=3440, http://pecl.php.net/bugs/bug.php?id=7360
Shira:
блин, жаль......
Александр Михалицын:
Shira,
добавил теме 1 балл, возможно кто-то знает решение.
Тема вполне себе может оказаться полезной.
Юрий Насретдинов:
Shira
Сразу после логина «запишите» PID своего процесса bash (это должен быть процесс bash с максимальным значением PID, у которого UID совпадает с вашим). Для этого должно быть достаточно вызвать команду ps (без параметров) и вручную распарсить, чтобы не плодить в процессе новых процессов bash. В качестве дисконнекта, в этом случае, подойдет простая команда


kill -s KILL нужный_PID


Это должно убить только нужный процесс bash, из-под которого Вы залогинились, и «оставить в живых» все остальные сессии и/или background скрипты.
Shira:
Юрий Насретдинов, а если не секрет какими ф-циями в рнр управлять процессами под win32? или я че то не так понимаю...... =(
Maus:
Shira
Попробую ответить за Юру:
http://www.php.net/manual/en/refs.fileprocess.process.php - здесь нет ответов?
из консольных команд под Win32 - имхо, почитайте справку к tasklist и taskkill
Shira:
Maus, на счет taskkill'а то я знаю, а вот как pid процесса найти не понимаю....
Shira:
да и в винде, а конкретнее в апаче, за это отвечает httpd.exe (он как раз и удерживает связь с сервером).... но это общий процесс для сервера!
Maus:
Shira
Минутку. Вы с какой стороны собрались убивать соединение? Насколько я понял, Юра предлагал Вам убивать процесс на удаленной машине. Приконнектились, поработали, застрелились.
Shira:
Maus, Вас понял.....!
Делаю ssh2_exec($id, "ps"), в ответ получаю пустую табличку (тока заголовок "PID TT STAT TIME COMMAND"). Если параллельно захожу с putty, то выше приведенная ф-ция отвечает не пустой табличкой, но там только тот bash процесс, который работает с putty.... В чем может быть дело? Аутентификацию в рнр прохожу с помощью публичного ключа....
Александр Михалицын:
Shira,
ну приведите еще исходный код.
Shira:

...
$ssh_fid = @ssh2_connect($_host, 22);
@ssh2_auth_pubkey_file(
$ssh_fid,
$_login,
'id_rsa.pub',
'id_rsa'
);
$temp = ssh2_exec($ssh_fid, "ps ax"); // Просто ps пустоту выдает
stream_set_blocking($temp, true);
$data = "";
while($temp2 = fgets($temp)){
$data .= $temp2;
}
$data = $parse_ps($data);
foreach($data as $k => $v){
if($v['command'] == 'sshd: USER@notty (sshd)'){
$ssh_pid = $v['pid'];
break;
}
}
fclose($temp);
...
ssh2_exec($ssh_fid, "kill -s KILL ".$ssh_pid);

и все равно соединение не рвется
Александр Михалицын:
Shira,
может вам вместо этого:

$data = "";
while($temp2 = fgets($temp)){
$data .= $temp2;
}


Попробовать вот так:
$data = stream_get_contents($temp);

Что-то мне подсказывает, что так правильнее...
Shira:
да то суть не в этом!
Александр Михалицын:
Shira,
ну а как вы можете утверждать, что:
ps пустоту выдает
выводили результат stream_get_contents($temp)?

Одним словом http://phpfaq.ru/debug.
Shira:
Александр Михалицын, если внимательно прочитать, то я писал, что ps отвечает пустоту И В СКОБКАХ УТОЧНИЛ, ЧТО ПУСТУЮ ТАБЛИЧКУ. Т.е. заголовок выводит, но данных нет....... Вы не в то русло проблему уводите =)
Во-вторых, в приведенном мною выше коде уже стоит не ps, а "ps ax", что выдает нужный результат, правда процесс не bash'овский, а "sshd: USERNAME@notty (sshd)" (юзернэйм убрал из своих соображений)...... вот его пытаюсь КИЛЛить, нет нужного результата!


ЗЫ: А вообще, если не ошибаюсь, stream_get_contents это вроде и есть совокупность fgets ф-ций
ЗЫЫ: Че то карма у меня скочет из-за этой темы во все стороны! =)
Александр Михалицын:
Shira,
е в то русло проблему уводите =)
Ну с тем объемом информации, что у нас в распоряжении, кроме как методом "научного тыка", вряд ли что-то можно понять...
Shira:
А какой объем информации нужен? Я уже совсем ничего не понимаю!
Идея, которую выдвинул уважаемый Юрий Насретдинов, не сработала....
Командой ps ax я получил список процессов, выделил из него процесс sshd: USERNAME@notty (sshd), пытаюсь сделать kill -s KILL - НЕ СРАБАТЫВАЕТ.

Эта тема на forum.dklab.ru