1 votos

entrada de socket launchd

Estoy tratando de ejecutar un servidor de red que se supone que recibe mensajes udp muy cortos terminados en línea nueva. El servicio plist se ve así

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>local.listener</string>
        <key>Program</key>
        <string>/bin/cat</string>
        <key>Sockets</key>
        <dict>
            <key>Listeners</key>
            <dict>
                 <key>SockType</key>
                 <string>dgram</string>
                 <key>SockNodeName</key>
                 <string>0.0.0.0</string>
                 <key>SockServiceName</key>
                 <integer>9999</integer>
            </dict>
        </dict>
        <key>inetdCompatibility</key>
        <dict>
            <key>Wait</key>
            <true/>
        </dict>
        <key>StandardOutPath</key>
        <string>/tmp/test.stdout</string>
</dict>

y se carga y hace lo que se supone que debe hacer (escribir cadenas de mensajes en /tmp/test.stdout). Sin embargo, me falla el reemplazo de /bin/cat por un shell script que lea el mensaje en una variable y me permita hacer algo con él. I pensé que algo así debería funcionar:

#!/bin/sh
read MSG
echo $MSG

pero esto parece bloquearse, al igual que

#!/bin/sh
/bin/cat

mientras que

#!/bin/sh
exec /bin/cat

todavía funciona. En la línea de comandos las tres variantes hacen más o menos lo mismo, por ejemplo

$ echo 123 | ./mycat.sh
123

y nada se bloquea. Se agradecería cualquier idea sobre estas sutiles diferencias.

1voto

guest Puntos 11

Ya casi has llegado. Envuelve tu primer script en un while y ya está listo:

#!/bin/sh

while true; do
    read MSG
    echo $MSG
done

Esto es necesario para mantener vivo el proceso. Sin el bucle el script sale después de la primera línea de entrada.

El exec El enfoque funciona porque sustituir el shell actual con /bin/cat . Es lo mismo que llamar a /bin/cat directamente.

0 votos

Lamentablemente, eso tampoco funciona. En cualquier caso, se supone que el script se inicia a petición, maneja el mensaje y sale. Pero a diferencia de la versión de /bin/cat (y la versión exec ...), no lo hace. En su lugar, se queda colgado y nunca escribe la salida. Parece que read nunca regresa, aunque el mensaje termina con una nueva línea (y /bin/cat escribe líneas en el archivo de salida, lo que creo que confirma que este es el caso).

0 votos

También me gustaría entender la diferencia entre canalizar algo en los scripts en la línea de comandos, donde todos leen una línea de entrada y la escriben en una línea de salida, y que sean llamados por launchd, donde dos de ellos aparentemente no lo hacen, aunque yo pensaba que eso era hacer prácticamente lo mismo.

0 votos

Lo siento. No sé qué hace que el trabajo se cuelgue en tu sistema. Tu plist y script me funcionan bien en MacOS 10.13. Tu versión se inicia cada vez que envío una cadena al puerto 9999, mi versión sigue funcionando después de la primera conexión.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X