1 votes

entrée du socket launchd

J'essaie d'exécuter un serveur de réseau qui est censé recevoir des messages udp très courts terminés par une nouvelle ligne. La plist du service ressemble à ceci

<?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>

et il se charge et fait ce qu'il est censé faire (écrire des chaînes de messages sur /tmp/test.stdout). Cependant, je n'arrive pas à remplacer /bin/cat par un shell script qui lit le message dans une variable et me laisse faire quelque chose avec. I pensais que quelque chose comme ceci devrait fonctionner :

#!/bin/sh
read MSG
echo $MSG

mais cela semble bloquer, de même que

#!/bin/sh
/bin/cat

tandis que

#!/bin/sh
exec /bin/cat

fonctionne toujours. En ligne de commande, les trois variantes font à peu près la même chose, par exemple,

$ echo 123 | ./mycat.sh
123

et rien ne bloque. Toute idée concernant ces différences subtiles serait appréciée.

1voto

vcapra1 Points 141

Vous y êtes presque. Emballez votre premier script dans un while et vous êtes prêt :

#!/bin/sh

while true; do
    read MSG
    echo $MSG
done

Ceci est nécessaire pour maintenir le processus en vie. Sans la boucle, le script sort après la première ligne d'entrée.

En exec Cette approche fonctionne parce que vous remplacer le shell actuel avec /bin/cat . C'est la même chose que d'appeler /bin/cat directement.

0 votes

Malheureusement, cela ne fonctionne pas non plus. Dans tous les cas, le script est censé être lancé à la demande, traiter le message, et sortir. Mais contrairement à /bin/cat (et la version exec ...), il ne le fait pas. Au lieu de cela, il s'attarde et n'écrit jamais la sortie. Il semble que read ne revienne jamais, bien que le message soit terminé par une nouvelle ligne (et /bin/cat écrit des lignes dans le fichier de sortie, ce qui je pense confirme que c'est bien le cas).

0 votes

J'aimerais également comprendre la différence entre le fait de piping quelque chose dans les scripts sur la ligne de commande, où tous lisent une ligne d'entrée et l'écrivent sur une ligne de sortie, et le fait qu'ils soient appelés par launchd, où deux d'entre eux ne le font apparemment pas, bien que je pensais que cela faisait à peu près la même chose.

0 votes

Je suis désolé. Je ne sais pas ce qui fait que le travail se bloque sur votre système. Votre plist et script fonctionnent très bien pour moi sur MacOS 10.13. Votre version se lance chaque fois que j'envoie une chaîne au port 9999, ma version continue de fonctionner après la première connexion.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X