2010-04-27 3 views
6

Я занимаюсь разработкой серверного приложения, и недавно я столкнулся с этой странной ошибкой на тестовом сервере (Debian Squeeze).popen failed with "sh: <command>: not found"

Каждый исполняемый Перехожу к POPEN терпит неудачу с сообщ:

sh: sort: not found // happens to any command 

Это происходит независимо указывают ли я полный путь возвращенного «тип» или покороче. Как упоминалось ранее, это происходит только в одной тестовой среде, чтобы добавить путаницу, я запускаю одну и ту же ОС и не имел никаких проблем.

Popen, по-видимому, используя ш выполнять команды, но если я запускаю ту же команду через командную строку (Баш или ш), все отлично

Заранее спасибо

(PS: даже ! попробовал Python os.popen просто прибить эту голову скребок, и он работает)

Редактировать это простой вызов, который терпит неудачу:

$command="tail -10 myfile"; 
$handle = popen($command.' 2>&1','r'); 
if($handle){ 
    while (!feof($handle)){ 
    ....//process buffer 
    } 
} 

возвращается:

sh: tail: not found 
+0

Пожалуйста, разместите фактический вызов, и если какие-либо переменные отображают, как они сгенерированы. –

+0

В результате это то же самое, используя полный путь двоичного кода? (Я имею в виду: whereis tail) – Cesar

+0

Да, до тех пор, пока его запустить через popen, sh возвращает эту ошибку msg .. – smallmeans

ответ

1

Возможно, ваш путь не настроен должным образом, при вызове POPEN. Я предполагаю, что это проблема конфигурации PHP, но вы можете обойти ее:

  1. Запустите which tail, чтобы определить полный путь к программе хвоста.
  2. Вызов popen с пути найден в 1.
+0

Это первое, что я пробовал. Команда «type» похожа на «которая» на Debian и дает полный путь .. но безрезультатно .. popen все еще сохраняется на «не найден», что довольно сложно в данный момент. – smallmeans

0

Я нашел этот вопрос в поисках моего ответа относительно точно такой же вывод. Хотя я кодирую в C, я все еще использую popen(). Я новичок в C и обнаружил, что сделал следующую ошибку.

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

Я объявил строку и объединил другие строки с ней, чтобы сформулировать мою командную строку.

Я напечатал строку на stdout, чтобы убедиться, что это была команда, которую я хотел. При копировании из stdout и выполнении линии работала. Так почему же оболочка забилась из popen()?

Я передал результат в файл и открыл файл в редакторе и увидел, что когда моя пустая строка была инициализирована, специальный символ «^ A» был создан со строкой, которая не отображалась на терминале.

я изменил способ, которым я объявлен массив символов из этого:

символ VarName [];

к этому:

символ VarName [512] = { ""};

Это решило проблему. Я призываю всех, у кого есть аналогичная проблема, искать скрытые символы в строке, используемой с popen().

Смежные вопросы