อินพุตซ็อกเก็ต launchd


0

ฉันพยายามเรียกใช้เซิร์ฟเวอร์เครือข่ายที่ควรได้รับข้อความ udp ที่ขึ้นบรรทัดใหม่สั้นมาก ผู้ให้บริการมีลักษณะเช่นนี้

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

และจะโหลดและทำสิ่งที่ควรทำ (เขียนสตริงข้อความไปที่ /tmp/test.stdout) อย่างไรก็ตามฉันไม่สามารถแทนที่ / bin / cat ด้วยเชลล์สคริปต์ที่อ่านข้อความเป็นตัวแปรและให้ฉันทำบางสิ่งกับมัน ฉันคิดว่าบางสิ่งเช่นนี้ควรใช้งานได้:

#!/bin/sh
read MSG
echo $MSG

แต่สิ่งนี้ดูเหมือนจะบล็อกและเช่นนั้น

#!/bin/sh
/bin/cat

ในขณะที่

#!/bin/sh
exec /bin/cat

ยังคงใช้งานได้ บนบรรทัดคำสั่งทั้งสามสายพันธุ์ทำในสิ่งเดียวกันเช่น

$ echo 123 | ./mycat.sh
123

และไม่มีอะไรบล็อก การเข้าใจถึงความแตกต่างเล็กน้อยเหล่านี้จะได้รับการชื่นชม

คำตอบ:


1

คุณเกือบจะอยู่ที่นั่น ล้อมสคริปต์แรกของคุณไว้ในwhileลูปแล้วตั้งค่า:

#!/bin/sh

while true; do
    read MSG
    echo $MSG
done

นี่เป็นสิ่งจำเป็นเพื่อให้กระบวนการอยู่รอด หากไม่มีลูปสคริปต์จะออกหลังจากป้อนบรรทัดแรก

execวิธีการทำงานเพราะคุณเปลี่ยน/bin/catเปลือกปัจจุบันด้วย มันเหมือนกับการโทร/bin/catโดยตรง


น่าเสียดายที่ไม่ได้ผลเช่นกัน ไม่ว่าในกรณีใดสคริปต์ควรจะเริ่มตามต้องการจัดการข้อความและออก แต่ต่างจากรุ่น / bin / cat (และรุ่น exec ... ) แต่ก็ไม่ได้ แต่มันค้างอยู่รอบ ๆ และไม่เคยเขียนเอาต์พุต ดูเหมือนว่าการอ่านจะไม่ส่งคืนแม้ว่าข้อความจะถูกยกเลิกการขึ้นบรรทัดใหม่ (และ / bin / cat เขียนบรรทัดลงในไฟล์เอาต์พุตซึ่งฉันคิดว่ายืนยันได้ว่าเป็นกรณีนี้จริง ๆ )
robmaz

ฉันยังต้องการที่จะเข้าใจความแตกต่างระหว่างการวางบางสิ่งบางอย่างลงในสคริปต์บนบรรทัดคำสั่งโดยที่ทุกคนอ่านบรรทัดอินพุตและเขียนลงในเอาต์พุตบรรทัดและพวกมันถูกเรียกโดย launchd โดยที่ทั้งสองดูเหมือนจะไม่ถึงแม้ว่า ฉันคิดว่าทำสิ่งเดียวกัน
robmaz

ฉันขอโทษ. ฉันไม่รู้ว่าอะไรทำให้งานหยุดงานในระบบของคุณ นักเขียนและสคริปต์ของคุณใช้ได้กับฉันใน macOS 10.13 เวอร์ชันของคุณเริ่มต้นทุกครั้งที่ฉันส่งสตริงไปยังพอร์ต 9999 เวอร์ชันของฉันจะยังคงทำงานต่อหลังจากการเชื่อมต่อครั้งแรก
แขกรับเชิญ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.