launchd socket input

0

Estoy intentando ejecutar un servidor de red que se supone que recibe mensajes udp terminados en una nueva línea muy corta. La lista de servicios se parece a esto

<?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 carga y hace lo que se supone que debe hacer (escribir cadenas de mensajes en /tmp/test.stdout). Sin embargo, fallo al reemplazar / bin / cat con un script de shell que lee el mensaje en una variable y me permite hacer algo con él. yo Pensé que algo como esto debería funcionar:

#!/bin/sh
read MSG
echo $MSG

pero esto parece bloquear, y también lo hace

#!/bin/sh
/bin/cat

mientras

#!/bin/sh
exec /bin/cat

todavía funciona. En la línea de comandos, las tres variantes hacen casi lo mismo, por ejemplo,

$ echo 123 | ./mycat.sh
123

y nada bloquea. Cualquier apreciación de estas diferencias sutiles sería apreciada.

    
pregunta robmaz 24.10.2017 - 16:50

1 respuesta

1

Ya casi estás allí. Envuelva su primer script en un bucle while y estará 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 enfoque de exec funciona porque reemplaza el shell actual con /bin/cat . Es lo mismo que llamar directamente a /bin/cat .

    
respondido por el guest 24.10.2017 - 17:59

Lea otras preguntas en las etiquetas