Xem stdout / stderr của dịch vụ systemd


175

Tôi đã tạo một tệp dịch vụ systemd đơn giản cho một ứng dụng tùy chỉnh. Ứng dụng hoạt động tốt khi tôi chạy thủ công, nhưng CPU của tôi được tối đa hóa khi tôi chạy nó với systemd.

Tôi đang cố gắng theo dõi vấn đề của mình ở đâu, nhưng tôi không biết tìm đầu ra ở đâu (hoặc cách định cấu hình systemd để đặt đầu ra ở đâu đó).

Đây là tập tin dịch vụ của tôi:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

Trong suốt ứng dụng, tôi xuất ra stdout và stderr.

Làm thế nào tôi có thể đọc đầu ra của daemon của tôi?

Biên tập:

Tôi tìm thấy man systemd.exec, trong đó đề cập đến StandardOutput=tùy chọn, nhưng tôi không chắc làm thế nào để sử dụng nó. Từ trang người đàn ông :

StandardOutput=

Kiểm soát nơi mô tả tệp 1 (STDOUT) của các quy trình được thực hiện được kết nối với. Có một trong những kế thừa , null , tty , syslog , kmsg , kmsg + console , syslog + console hoặc socket .

Nếu được đặt để kế thừa bộ mô tả tệp của đầu vào tiêu chuẩn được nhân đôi cho đầu ra tiêu chuẩn. Nếu được đặt thành đầu ra tiêu chuẩn null sẽ được kết nối với /dev/null, tức là mọi thứ được ghi vào nó sẽ bị mất. Nếu được đặt thành đầu ra tiêu chuẩn tty sẽ được kết nối với một tty (như được định cấu hình qua TTYPath=, xem bên dưới). Nếu TTY chỉ được sử dụng cho đầu ra, quy trình được thực hiện sẽ không trở thành quy trình kiểm soát của thiết bị đầu cuối và sẽ không thất bại hoặc chờ các quy trình khác giải phóng thiết bị đầu cuối. syslog kết nối đầu ra tiêu chuẩn với bộ ghi hệ thống syslog (3). kmsg kết nối nó với bộ đệm nhật ký kernel có thể truy cập thông qua dmesg (1). syslog + consolekmsg + consolehoạt động tương tự nhưng cũng sao chép đầu ra vào bảng điều khiển hệ thống. ổ cắm kết nối đầu ra tiêu chuẩn với một ổ cắm từ kích hoạt ổ cắm, ngữ nghĩa tương tự như tùy chọn tương ứng của StandardInput=. Cài đặt này mặc định để kế thừa.

Điều này có nghĩa rằng đây là những lựa chọn duy nhất của tôi? Tôi muốn, ví dụ, để đưa đầu ra vào /dev/shmhoặc một cái gì đó. Tôi cho rằng tôi có thể sử dụng một ổ cắm tên miền Unix và viết một trình nghe đơn giản, nhưng điều này có vẻ hơi không cần thiết.

Tôi chỉ cần cái này để gỡ lỗi, và có lẽ cuối cùng tôi sẽ xóa hầu hết các bản ghi và thay đổi đầu ra thành syslog.


Bạn đã thử kiểm tra /var/log/syslogđầu ra chưa? Hầu hết các hệ thống sẽ đăng nhập vào /var/log/để tôi bắt đầu bằng cách kiểm tra ở đó. Bạn có thể sử dụng grepđể tìm kiếm văn bản nếu bạn biết đầu ra: grep "my output" /var/lognên thực hiện thủ thuật.
sbtkd85

@ sbtkd85 - Chà, tôi không có /var/log/syslog, nhưng /var/log/messagesthực hiện mánh khóe. Vấn đề là, theo nhật ký, trình nền của tôi gặp sự cố khi bắt đầu, nhưng tôi có thể nói rằng nó vẫn đang chạy vì nó có máy chủ HTTP và tôi có thể truy vấn nó. Có vẻ như phần còn lại của các bản ghi đang bị mất ...
beatgammit

Tại sao không thử cài đặt StandardOutput=ttyđể bạn có thể thấy những gì đang xảy ra khi bạn khởi chạy trình nền của mình. Nó sẽ xuất thiết bị đầu cuối (bạn có thể phải sử dụng ttyS0hoặc tương tự để có được đầu ra trên màn hình của bạn).
sbtkd85

3
Các toán tử chuyển hướng IO không nên hoạt động trong bối cảnh này. Một cái gì đó giống nhưExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Găngal

Điều gì thực sự lạm dụng CPU của bạn? Có phải systemd, dịch vụ hoặc hệ thống của bạn (ví dụ: bằng cách sinh ra các bản sao mới của dịch vụ vì systemd phát điên)?
peterph

Câu trả lời:


183

Cập nhật

Như mikemaccana lưu ý, tạp chí systemd hiện là thiết bị ghi nhật ký tiêu chuẩn cho hầu hết các bản phát hành. Để xem stdoutstderrcủa một đơn vị systemd sử dụng journalctllệnh.

sudo journalctl -u [unit]

Câu trả lời gốc

Theo mặc định stdoutstderrcủa một đơn vị systemd được gửi đến syslog.

Nếu bạn đang sử dụng toàn bộ systemd, điều này sẽ được thông qua journalctl. Trên Fedora, nó nên như /var/log/messagesvậy nhưng syslog sẽ đặt nó ở nơi quy tắc của bạn nói.

Do ngày đăng bài và giả sử hầu hết mọi người tiếp xúc với systemd đều thông qua fedora, bạn có thể đã gặp phải lỗi được mô tả ở đây: https://bugzilla.redhat.com/show_orms.cgi?id=754938 Nó có một lời giải thích tốt về cách tất cả hoạt động quá =) (Đây là một lỗi trong chính sách selinux khiến thông báo lỗi không được ghi lại và đã được sửa trong selinux-policy-3.10.0-58.fc16)


5
Lưu ý rằng sử dụng cơ chế ghi nhật ký tiêu chuẩn như thế này sẽ không tạo ra các bản ghi liên tục theo mặc định. Để làm điều đó, bạn sẽ cần tạo / var / log / tạp chí, rồi chạysudo systemctl restart systemd-journald
mlissner

1
cơ sở syslog và ưu tiên?
ngày

2
Điều này làm việc cho tôi: StandardOutput=syslog+consoleStandardError=syslog+consolesau đó tất cả đầu ra từ đơn vị của tôi xuất hiện trên tạp chí. Các thiết lập mặc định là sai rõ ràng. (Chẳng hạn như DefaultSt
ChuẩnOutput

2
-flà hữu ích cho tôi. Theo dõi nhật ký khi có thay đổi (trường hợp sử dụng theo máy chủ minecraft đang chạy như một daemon)
blaughw

2
Điều này làm tôi phát điên ... Trên một tạp chí kéo dài Debian tiêu chuẩn sẽ không cho tôi thấy bất kỳ đầu ra tiêu chuẩn nào. Tôi thậm chí sử dụng /usr/bin/stdbuf -oL <cmd>và một rõ ràng StandardOutput=journal. Vẫn không có gì.
jlh

81

Câu trả lời ngắn hơn, đơn giản hơn, không kế thừa:

sudo journalctl -u [unitfile]

Trong đó [unitfile] là .servicetên systemd . Ví dụ, để xem tin nhắn từ myapp.service,

sudo journalctl --unit=myapp

Để theo dõi nhật ký trong thời gian thực:

sudo journalctl -f -u myapp

4
Lưu ý rằng bạn có thể phải chịu sudonếu bạn gặp No journal files foundlỗi.
bigjosh

5
syslog không phải là di sản ...
Miles Rout

2
Đó là trong các bản phân phối Linux hiện tại. Bạn có thể thực sự thích syslog nhưng điều đó không thay đổi những gì họ gửi cùng.
mikemaccana

1
Chắc chắn rồi. Và nó cũng sử dụng syslog. Quan điểm của tôi không phải là systemd không được sử dụng, nhưng syslog đó không phải là di sản.
mê cung

6
@JECompton nếu tất cả việc đăng nhập vào các bản phân phối Linux hiện tại đều sử dụng journald và syslog là không cần thiết và chỉ được sử dụng để tương thích, thì nó theo logic một cách hợp lý rằng syslog là di sản.
mikemaccana
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.