2010-04-27 9 views
6

Estoy desarrollando una aplicación de servidor y recientemente encontré este extraño error en un servidor de prueba (Debian Squeeze).popen falla con "sh: <command>: no encontrado"

Cada ejecutable que pase a popen falla con un error:

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

Esto ocurre independientemente de si señalo la ruta completa devuelto por "tipo" o que sea breve. Como se mencionó anteriormente, esto sucede en un solo entorno de prueba, para agregar confusión, estoy ejecutando el mismo sistema operativo y no tuve ningún problema en absoluto.

Popen es aparentemente utilizando sh para ejecutar comandos, pero si corro el mismo comando a través de la línea de comandos (bash o sh), todo está bien

Gracias de antemano

(PD: incluso ! Python trató simplemente os.popen para clavar este rascador de cabeza, y funciona)

Editar esto es una llamada simple que falla:

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

devuelve:

sh: tail: not found 
+0

Publique la llamada real, y si usa alguna variable, muestre cómo se generan. –

+0

¿El resultado es el mismo usando la ruta completa del binario? (Quiero decir: whereis tail) – Cesar

+0

sí, siempre que se ejecute a través de popen, sh devuelve ese mensaje de error ... – smallmeans

Respuesta

1

Probablemente su PATH no está configurado correctamente, cuando se llama a popen. Supongo que esto es un problema de configuración de PHP, pero se puede prescindir de ella por:

  1. which tail Run para determinar la ruta completa al programa cola.
  2. llamada popen con el camino encuentran en 1.
+0

Esto es lo primero que intenté. El comando "type" es similar a "which" en Debian y da la ruta completa ... pero fue en vano ... popen aún persiste en "not found", lo cual es bastante desconcertante en este punto ... – smallmeans

0

me encontré con esta pregunta durante la búsqueda de mi propia respuesta con respecto a exactamente la misma salida. Aunque estoy codificando en C, todavía estoy usando popen(). Soy un principiante en C y descubrí que cometí el siguiente error.

Estoy respondiendo esto con la esperanza de que pueda ser útil para otros que busquen el mismo mensaje de error. Así es como encontré, descubrí y corrigí el problema.

He declarado una cadena y concatenado otras cadenas con ella para formular mi línea de comandos.

Imprimí la línea a stdout para verificar que era el comando que quería. Cuando se copió de stdout y se ejecutó, la línea funcionó. Entonces, ¿por qué el obturador de shell de popen()?

Grabé la salida en un archivo y abrí el archivo en un editor, y vi que cuando se inicializaba la cadena vacía, se creaba el carácter especial '^ A' con la cadena, que no se mostraba en el terminal.

I cambió la forma I declaró la matriz de caracteres de esta:

Char varname [];

a esto:

Char varname [512] = { ""};

Esto resolvió el problema. Animaría a cualquiera con un problema similar a buscar caracteres ocultos en la cadena utilizada con popen().

Cuestiones relacionadas