Socat có thể được bắt đầu trực tiếp bởi systemd?


7

Dòng lệnh socat sau hoạt động như mong đợi khi được nhập tại dấu nhắc shell:

# /usr/bin/socat UDP-RECV:4321 STDOUT

Nó lắng nghe trên cổng UDP 4321 và ghi mọi thứ nhận được vào đầu ra tiêu chuẩn.

Sau đây là một nỗ lực bắt đầu lệnh này dưới dạng dịch vụ systemd với ý định ghi dữ liệu nhận được vào nhật ký systemd (đích đến mặc định cho đầu ra tiêu chuẩn của dịch vụ):

# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT

Tuy nhiên, socat thoát ngay lập tức khi dịch vụ này được bắt đầu:

Process: 7425 ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT (code=exited, status=0/SUCCESS)

Nghiên cứu vấn đề (chạy socatvới -d -d -d -d) đánh giá rằng nó nhận được EOF trên đầu ra tiêu chuẩn:

N starting data transfer loop with FDs [5,5] and [1,1]
N socket 2 (fd 1) is at EOF
I close(5)
N exiting with status 0

Có thể sử dụng socatnhư một dịch vụ systemd?


Tất nhiên bạn có thể chạy socatnhư một dịch vụ systemd, không có gì ngăn bạn làm điều đó. Nhưng tôi thực sự tự hỏi những mong đợi của bạn về stdoutluồng. Bạn chắc chắn không mong đợi một dịch vụ hệ thống được kết nối với phiên cuối, phải không?
Pavel imerda

Tôi biết tôi tất nhiên có thể chạy socat như một dịch vụ systemd. Nhưng một cái gì đó đang khiến nó thoát ra và nó trông giống như một EOF trên thiết bị xuất chuẩn. Tôi chắc chắn không mong đợi một dịch vụ systemd được kết nối với phiên cuối . Nếu bạn biết bất cứ điều gì về systemd thì bạn sẽ biết rằng các thiết bị xuất chuẩn của mặc định được kết nối với tạp chí ... giống như tôi đã nói trong câu hỏi của mình.
starfry

Thư giãn, không cần đối đầu. Tôi thấy bây giờ đã có một câu trả lời được chấp nhận và thực sự có liên quan đến các luồng tiêu chuẩn, vì vậy không có gì bất ngờ.
Pavel imerda

Câu trả lời:


7

Vấn đề là do socatmặc định hai chiều. Nó cố gắng đọc đầu vào tiêu chuẩn của nó /dev/null, nó nhận được EOF và thoát.

Giải pháp là sử dụng -utùy chọn:

ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT

Điều này nói với socat để chạy đơn phương từ UDP-RECV:4321đến STDOUT.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.