Logs

查看 systemd 服務的 stdout/stderr

  • May 18, 2019

我為自定義應用程序創建了一個簡單的 systemd 服務文件。當我手動執行該應用程序時,它執行良好,但是當我使用 systemd 執行它時,我的 CPU 會被最大化。

我正在嘗試找出問題出在哪裡,但我不知道在哪裡可以找到輸出(或如何配置 systemd 以將輸出放在某處)。

這是我的服務文件:

[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

在整個應用程序中,我輸出到 stdout 和 stderr。

如何讀取我的守護程序的輸出?

編輯:

我發現man systemd.exec,其中提到了該StandardOutput=選項,但我不確定如何使用它。從手冊頁

StandardOutput=

控制已執行程序的文件描述符 1 (STDOUT) 連接到的位置。採用inheritnullttysyslogkmsgkmsg+consolesyslog+consolesocket之一。

如果設置為繼承標準輸入的文件描述符,則為標準輸出複制。如果設置為,標準輸出將連接到/dev/null,即寫入其中的所有內容都將失去。如果設置為tty ,標準輸出將連接到 tty(通過 配置*TTYPath=,見下文)。如果 TTY 僅用於輸出,則執行的程序不會成為終端的控制程序,不會失敗或等待其他程序釋放終端。 syslog將標準輸出連接到 syslog(3) 系統記錄器。 kmsg將它與可通過 dmesg(1) 訪問的核心日誌緩衝區連接起來。 syslog+consolekmsg+console工作類似,但也將輸出複製到系統控制台。 socket將標準輸出連接到套接字啟動的套接字,語義類似於StandardInput=*. 此設置預設為繼承。

這是否意味著這些是我唯一的選擇?例如,我想將輸出放入/dev/shm或其他東西中。我想我可以使用 Unix 域套接字並編寫一個簡單的偵聽器,但這似乎有點不必要。

我只需要它來調試,我可能最終會刪除大部分日誌並將輸出更改為 syslog。

更新

正如 mikemaccana 所說,systemd 日誌現在是大多數發行版的標準日誌記錄設備。要查看 systemd 單元的stdoutand stderr,請使用該journalctl命令。

sudo journalctl -u [unit]

原始答案

預設情況下stdoutstderr一個 systemd 單元被發送到 syslog。

如果您使用的是完整的 systemd,則可以通過journalctl. 在 Fedora 上,它應該是/var/log/messages,但 syslog 會將它放在你的規則所說的地方。

由於發布的日期,假設大多數接觸 systemd 的人都是通過 fedora,你可能被這裡描述的錯誤擊中: https ://bugzilla.redhat.com/show_bug.cgi?id=754938 它有一個很好的解釋它是如何工作的=)(這是 selinux-policy 中的一個錯誤,導致錯誤消息不被記錄,並selinux-policy-3.10.0-58.fc16

引用自:https://unix.stackexchange.com/questions/20399