systemd vào ngày 15.04 sẽ không đăng xuất stdout của đơn vị


12

Tôi hiện đang cố gắng tạo một đơn vị systemd như một máy chủ web. Hiện tại, foo.servicetập tin của tôi trông như sau:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

Việc foothực thi tự động ghi lại tất cả các yêu cầu HTTP vào thiết bị xuất chuẩn - điều này đã được kiểm tra tốt. Tuy nhiên, khi tôi xem nhật ký journalctl -u foo, tôi chỉ nhận được kết quả như sau:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

Ai đó có thể giải thích tại sao nó không đăng nhập tất cả đầu ra xuất chuẩn? Tôi đã xem xét ngắn gọn câu hỏi trước đó , nhưng nó không có ích - tuy nhiên nó đã ám chỉ điều gì đó dọc theo dòng chữ "... có thể không hoạt động đối với các hệ thống không sử dụng toàn hệ thống" - đây có phải là trường hợp của Ubuntu 15.04 ? Cảm ơn bạn trước, bất kỳ trợ giúp với điều này sẽ được nhiều đánh giá cao!


1
Hãy chắc chắn rằng, quá trình của bạn không đệm bộ đệm đầu ra. Tôi đã gặp vấn đề tương tự và nó đã được giải quyết bằng cách vô hiệu hóa bộ đệm đầu ra của tập lệnh python của tôi. Vì số lượng bản ghi nhật ký được tạo ra không nhiều, có vẻ như không có ghi nhật ký, nhưng thực tế, nó vẫn chưa có cơ hội, vì tất cả vẫn đang tập hợp trong bộ đệm đầu ra xuất sắc.
Jan Vlcinsky

1
Cố gắng khắc phục điều này quá. Tôi có một ấn tượng rằng systemd không đệm. stdout là bộ đệm dòng trong UNIX, nhưng systemd thực hiện công việc của riêng nó và bộ đệm nhiều hơn nữa (để có thể nhanh nhưng vô dụng có thể).
Velkan

Tôi có cùng một vấn đề và bộ đệm với chức năng in của Python là vấn đề! Vì tôi đang sử dụng Python 3, tôi chỉ sử dụng một cái gì đó như thế print('Hello World!', flush=True)và đó là một mẹo nhỏ! Đầu ra bắt đầu hiển thị trên tạp chí.
timbram

Câu trả lời:


9

Trong thực tế, bộ đệm trong UNIX phụ thuộc vào ngữ cảnh: khi thiết bị xuất chuẩn được chuyển hướng đến một thứ tương tác như bàn điều khiển - nó thường được đệm theo dòng, nếu không thì nó được đệm hoàn toàn.

Bộ đệm có thể được thay đổi bên trong ứng dụng bằng cách sử dụng lệnh gọi thư viện setvbuf .

Nhưng nó cũng có thể được thực hiện với lệnh stdbuf khi khởi chạy:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(đối với trường hợp đệm dòng)


Điều này đã cứu ngày của tôi! Cảm ơn rât nhiều. Nhưng tôi hơi bối rối rằng ExecStart=/my/foo/program, tại sao nhật ký xuất chuẩn không bị xóa khi dịch vụ bị chấm dứt mà thay vào đó hoàn toàn biến mất.
wlnirvana

0

Theo mặc định trên Ubuntu 15.04 , các tạp chí systemd chỉ biến động và bị giữ lại /run/systemd/journalvà bị mất trong mỗi lần khởi động lại. Để sử dụng nhật ký systemd liên tục , bạn cần tạo thư mục (và khởi động lại systemd-journald.service)./var/log/journal

Vì vậy, có thể, stdoutđầu ra chỉ được chuyển hướng đến syslogvà không được giữ trong tạp chí systemd . Đối với điều đó, bạn có thể cần phải sử dụng một tạp chí systemd liên tục như đã giải thích ở trên.

Bạn đã kiểm tra nhật ký /var/log/syslogcủa bạn foo?


Tôi đã tạo /var/log/journalnhư bạn đã đề cập, nhưng dù sao tôi cũng không thấy dịch vụ hệ thống của mình. trong /var/log/syslogtôi không thấy nó
đăng xuất
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.