Ejecutar script de shell con system() devuelve 256. ¿Qué significa eso?

2 minutos de lectura

avatar de usuario
Jan Deinhard

He escrito un script de shell para reiniciar HAProxy (proxy inverso). Ejecutar el script desde el shell funciona. Pero quiero un demonio para ejecutar el script. Eso no funciona. system() devuelve 256. No tengo ni idea de lo que eso podría significar.

#!/bin/sh
# save previous state
mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.old
mv /var/run/haproxy.pid /var/run/haproxy.pid.old

cp /tmp/haproxy.cfg.new /home/haproxy/haproxy.cfg
kill -TTOU $(cat /var/run/haproxy.pid.old)
if haproxy -p /var/run/haproxy.pid -f /home/haproxy/haproxy.cfg; then
  kill -USR1 $(cat /var/run/haproxy.pid.old)
  rm -f /var/run/haproxy.pid.old
  exit 1
else
  kill -TTIN $(cat /var/run/haproxy.pid.old)
  rm -f /var/run/haproxy.pid
  mv /var/run/haproxy.pid.old /var/run/haproxy.pid
  mv /home/haproxy/haproxy.cfg /home/haproxy/haproxy.cfg.err
  mv /home/haproxy/haproxy.cfg.old /home/haproxy/haproxy.cfg
  exit 0
fi

HAProxy se ejecuta con el usuario haproxy. Mi daemon también tiene su propio usuario. Ambos funcionan con sudo.

¿Alguna pista?

avatar de usuario
habilidoso

De acuerdo a esta y quede Perl system() devuelve valores de salida multiplicados por 256. Así que en realidad está saliendo con 1. Parece que esto sucede en C también.

  • ¡Gracias! Entonces es EPERM /* Operación no permitida */ … pero por qué … Empiezo el daemon con sudo.

    -Jan Deinhard

    17 de septiembre de 2010 a las 14:57


  • Perl no devuelve valores de salida multiplicados. Devuelve un valor de 16 bits, con el código de salida en los 8 bits superiores. A menudo es lo mismo, pero no siempre.

    – mivk

    27 de noviembre de 2015 a las 18:37

  • Esto también se aplica a la mayoría de los binarios de Linux/gcc, no solo a Perl.

    – Víctor Sergio

    25 de enero de 2017 a las 2:05

A menos que el sistema devuelva -1, su valor de retorno tiene el mismo formato que el valor de estado de la familia de espera de llamadas al sistema (espera de hombre 2). Hay macros que le ayudarán a interpretar este estado:

man 3 wait

Enumera estas macros y lo que le dicen.

Un código de 256 probablemente significa que el comando del sistema no puede localizar el binario para ejecutarlo. Recuerde que puede que no esté llamando a bash y que puede que no tenga rutas configuradas. ¡Inténtalo de nuevo con rutas completas a los binarios!

  • No. Si no pudiera encontrar el ejecutable, devolvería -1.

    – mivk

    27 de noviembre de 2015 a las 18:38


Tengo el mismo problema cuando invoco un script que contiene el comando ‘matar’ en un demonio. El demonio debe haber cerrado el stdout, stderr… Usar algo como system(“scrips.sh > /dev/null”) debería funcionar.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad