Ich versuche, die für einen „vernetzten Drucker“ bestimmten Daten zu erfassen, damit sie lokal verarbeitet oder an ein anderes System weitergeleitet werden können. Es sieht so ausLinux als Netzwerkdruckergerät (Raw, Port 9100)
tut, was ich will und erfordert nur:
9100 stream tcp nowait cat > some_file
aber ich möchte es auf meinem Macbook testen können und das hat nicht inetd
.
Ich könnte es möglicherweise verwenden, launchd
da es der Ersatz für inetd
OSX ist, aber wenn man die Dokumentation liest, ist nicht klar, wie man das Äquivalent zum obigen erreicht. Also suche ich nach einer der beiden Lösungen – wie man es inetd
für OSX bekommt oder wie man eine plist-Datei erstellt, die das Äquivalent erreicht.launchd
Antwort1
Die vorhandenen Start-XML-Dateien in /Library/LaunchDaemons
oder /System/Library/LaunchDaemons
verdienen Studium; von einem dieser und mit etwas grepping über in/etc/services
$ grep 9100 /etc/services
hp-pdl-datastr 9100/udp # PDL Data Streaming Port
hp-pdl-datastr 9100/tcp # PDL Data Streaming Port
man könnte eine der vorhandenen Dateien an das anpassen, was ich gespeichert habe/Library/LaunchDaemons/cattery.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>com.exampe.cattery</string>
<key>ProgramArguments</key>
<array>
<string>/var/root/cattery</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
<key>InitGroups</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>hp-pdl-datastr</string>
<key>SockType</key>
<string>stream</string>
</dict>
</dict>
</dict>
</plist>
Hier /var/root/cattery
ist das fehlerhafte Testskript (was passiert, wenn Clients sich zwei oder mehr Mal pro Sekunde verbinden?):
$ sudo cat /var/root/cattery
#!/bin/sh
cat > "/var/root/out.$(date +%s)"
$ sudo chmod +x /var/root/cattery
Und dann aktivieren wir unseren neuen Service
$ sudo launchctl load -w /Library/LaunchDaemons/cattery.plist
Und geben Sie ihm einige Testdaten
$ echo foo | nc localhost 9100
$ sudo find /var/root -name out\* -maxdepth 1
/var/root/out.1511845970
$ sudo cat /var/root/out.1511845970
foo
$
HINWEIS: Dieser Code sollte wahrscheinlich nicht als ausgeführt werden root
.
<key>UserName</key>
<string>_lp</string>
Zeile wie in /System/Library/LaunchDaemons/org.cups.cups-lpd.plist
kann dazu beitragen, das Obige nicht als auszuführen. root
In diesem Fall muss das Ausgabeverzeichnis für die gespeicherten Daten für diesen Benutzer beschreibbar und das ausgeführte Programm für diesen Benutzer ausführbar (und möglicherweise auch lesbar) sein.