exec не нашел файл - PullRequest
       12

exec не нашел файл

0 голосов
/ 17 декабря 2010

У меня проблемы с функцией exec php.Когда я делаю:

ls -al /dev/sdf1  

Этот архив не найден (ls: нет доступа к / dev / sdf1: нет такого файла или каталога), но если я запускаю эту команду, в консоли выдаетсяИнформация.Что я могу сделать?Это случается даже при запуске php-скрипта от имени root !!

$mountcommand = "ls -al /dev/$unit  2>&1";
exec("$mountcommand", &$mountoutput, &$mountresult);
print_r($mountoutput);
echo "\n$mountcommand\n\n";

Это разветвленный процесс

Ответы [ 2 ]

0 голосов
/ 26 января 2011

Я исправляю это с помощью сна между этим кодом и кодом, который дал мне «единицу»

0 голосов
/ 17 декабря 2010

У меня работает.

Диски:

frayser@gentoo ~/doc/Answers/src/PHP $ disk

sda     111.790 GB
sdb     233.762 GB
sdc     233.762 GB
sdd     233.762 GB
sde     279.481 GB
------------------
Total:  1092.558 GB

Использование hde:

frayser@gentoo ~/doc/Answers/src/PHP $ l /dev/sde
brw-rw---- 1 root disk 8, 64 Dec  2 13:36 /dev/sde

Использование PHP:

frayser@gentoo ~/doc/Answers/src/PHP $ php lsdev.php 
Z: brw-rw---- 1 root disk 8, 64 Dec  2 13:36 /dev/sde

скрипт:

frayser@gentoo ~/doc/Answers/src/PHP $ cat lsdev.php 
<?php
$z=exec("ls -lr /dev/sde");
print "Z: " . $z . "\n";
?>

Обновление

Также работает с ls -al.Пожалуйста, покажите свой сценарий.

Обновление 2

По линиям предложения chroot от ircmaxell: Предположим, что / dev, как видно из процесса PHP, было специальным файлом chroot для реального,И предположим, что / dev / sdf1 - съемное устройство.Когда вставляется sdf1 (медиа), система автоматически создает устройство в реальном / dev;но версия chroot не обновляется.Итак, чтобы обнаружить эту ситуацию, посмотрите на различия между / dev, как видно из PHP и из командной строки.

Один тест - ls -id on / dev (из PHP и командной строки).Это печатает индекс / dev.Есть ли несоответствие в номерах инодов?

Можно ли удалить / dev / sdf1?Это установлено?Если он установлен;видит ли процесс PHP смонтированную файловую систему: ls $mount_point из PHP it.

Существуют другие тесты chroot , перечисленные в Переполнение стека и в других местах;но я не нашел много хороших: если chroot сделан правильно, его трудно обнаружить.

Update 3

Это может быть то, что происходит: Устройство (/ dev / sdf1)требуется время, чтобы появиться после его создания;поэтому необходимо сделать паузу между созданием устройства и попыткой его монтирования:

До: устройство создано;но его там нет ...

Array
(
    [0] => Logging out of session [sid: 4, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]
    [1] => Logout of [sid: 4, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful
    [2] => Logging in to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]
    [3] => Login to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful
    [4] => ls: cannot access /dev/sdg: No such file or directory
)

{ test -b /dev/sdg && sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -u; sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -l; ls -al /dev/sdg ;} 2>&1

После: добавлена ​​1-секундная пауза, и устройство (sdg) доступно ...

Array
(
    [0] => Logging out of session [sid: 5, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]
    [1] => Logout of [sid: 5, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful
    [2] => Logging in to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]
    [3] => Login to [iface: iface0, target: iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e, portal: 172.16.0.1,3260]: successful
    [4] => brw-rw---- 1 root disk 8, 96 Dec 18 05:27 /dev/sdg
)

{ test -b /dev/sdg && sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -u; sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -l; sleep 1; ls -al /dev/sdg ;} 2>&1

PHP спауза ...

<code><pre>
<?php
$unit='sdg';
$reset="test -b /dev/sdg && sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -u";

$connect="sudo iscsiadm -m node -T iqn.2004-08.org.frayser:gen2-dummy.ad4s0.dos.e -l";

$test="ls -al /dev/$unit";

$mountcommand = "{ $reset; $connect; sleep 1; $test ;} 2>&1";
exec("$mountcommand", $mountoutput, $mountresult);
print_r($mountoutput); 
echo "\n$mountcommand\n\n";
?>

/ etc / sudoers настроен так же, как сообщалось в предыдущем вопросе о сбое монтирования из PHP .

Поэтому добавьте секунду или две функции sleep () после того, как iscsiadm создаст устройство.Сон может быть выполнен в PHP вместо exec () оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...