我用 来检查服务状态systemctl status service-name。
默认情况下,我只看到几行,所以我添加-n50以查看更多。
有时,我想从头开始查看完整日志。它可能有 1000 行。
现在,我检查它,-n10000但这看起来不是很好的解决方案。
是否有类似于less命令的选项来检查完整的 systemd 服务日志?
我在谷歌找不到任何安全的方法来清除 systemd 日志。有谁知道这样做的任何安全可靠的方法?
假设我正在尝试一些东西,我的日志被各种错误消息弄得乱七八糟。此外,我正在使用 Conky 在桌面上显示我的日记。我真的不想看到那些错误,因为它们让我想起我正在修复这些东西的糟糕日子,我想在经历了这次恐怖之后感觉自己像个新手。我想每个人都会同意这是清除日志的正当理由:P。
我为自定义应用程序创建了一个简单的 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
Run Code Online (Sandbox Code Playgroud)
在整个应用程序中,我输出到 stdout 和 stderr。
如何读取守护进程的输出?
编辑:
我发现man systemd.exec,其中提到了该StandardOutput=选项,但我不确定如何使用它。从手册页:
StandardOutput=控制已执行进程的文件描述符 1 (STDOUT) 连接到的位置。采用inherit、null、tty、syslog、kmsg、kmsg+console、syslog+console或socket 之一。
如果设置为继承标准输入的文件描述符,则为标准输出复制。如果设置为null标准输出将连接到
/dev/null,即写入的所有内容都将丢失。如果设置为tty标准输出将连接到 tty(通过 配置TTYPath=,见下文)。如果仅使用TTY 输出,则执行的进程不会成为终端的控制进程,也不会失败或等待其他进程释放终端。 …
我的笔记本电脑上有 2 个显卡。一个是IGP,另一个是离散的。
我写了一个shell脚本来关闭独立显卡。
如何将其转换为 systemd 脚本以在启动时运行它?
我的问题:
我正在编写一个 bash 脚本,我想在其中检查给定的服务是否正在运行。
我知道如何手动执行此操作,使用$ service [service_name] status.
但是(尤其是在转向 systemd 之后)会打印一大堆文本,解析起来有点麻烦。我假设有一个为脚本制作的命令,带有简单的输出或我可以检查的返回值。
但是谷歌搜索只会产生大量“哦,只是ps aux | grep -v grep | grep [service_name]”的结果。这不可能是最佳做法,是吗?如果该命令的另一个实例正在运行,但不是由 SysV init 脚本启动的呢?
还是我应该闭嘴,用一点 pgrep 弄脏我的手?
我有一项我想开始的服务systemd。当该服务启动时,我希望能够为其分配一个当前工作目录。如果我正在使用init,我知道该怎么做,但是我在使用systemd.
这就是我一直在努力工作的内容。
我创建了一个简单的实用程序(“listdir”),用 Python 编写,并放置在/opt/bin/listdir:
#! /usr/bin/python
import os
print 'Current working directory: %s' % (os.getcwd())
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个listdir.service文件systemd并将它放在这里/lib/systemd/system/listdir.service:
[Unit]
Description=Test of listing CWD.
[Service]
ExecStartPre=chdir /usr/local
ExecStart=/opt/bin/listdir
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
当我运行systemctl start listdir我的系统日志时,将根目录(“/”)记录为当前工作目录。当然,我期望/usr/local作为当前目录,因为我认为ExecStartPre在开始该过程之前会更改目录。
显然,我想象它systemd会像 shell 脚本一样工作(即使我知道它不是 shell 脚本)。有人可以让我知道我应该做什么吗?甚至可以使用systemd? 谢谢!
编辑:我的系统日志报告错误。(我刚注意到。)
Executable path is not absolute, ignoring: chdir /usr/local
Run Code Online (Sandbox Code Playgroud)
所以, …
我刚切换到 debian jessie,大多数东西都运行正常,包括我的图形显示管理器wdm。
问题是,我只是不明白这是如何工作的。显然我的/etc/init.d/wdm脚本被调用了,因为当我exit在那里提前放置时,wdm 没有启动。但是当我或者重命名 /etc/rc3.d目录时(我的默认运行级别曾经是 3),然后 wdm 仍然启动。
我不知道 systemd 如何找到这个脚本,我不明白它对所有其他 init.d 脚本做了什么。
我读到单元文件有两个文件夹(不在用户模式下)。
/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator
Run Code Online (Sandbox Code Playgroud)
与这种理解相冲突的是这个问题的答案:如何为 Systemd 编写启动脚本。有人可以填写缺失的信息以便我了解发生了什么吗?(更新:答案已更新,我的理解不再与之冲突。)
此外,脚本似乎组织在文件夹内的子/etc/systemd/system/文件夹中:
getty.target.wants
multi-user.target.wants
Run Code Online (Sandbox Code Playgroud)
在另一个位置,我读到还有其他位置。这些似乎是针对用户特定的服务。
/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.
Run Code Online (Sandbox Code Playgroud)
2015-08-31 更新:
为了其他人,这里是我最近问的一个相关问题的链接:我在哪里放置由 systemd 单元执行的脚本?
我对 systemd 比较陌生,正在学习它的架构。
现在,我正试图弄清楚如何使自定义 shell 脚本运行。该脚本需要运行后,网络层已启动。
我正在运行 Arch,使用 systemd 和 netctl。
为了测试,我编写了一个简单的脚本,它只执行ip addr list > /tmp/ip.txt. 我为此脚本创建了以下服务文件。
(/etc/systemd/system/test.service)
[Unit]
Description=test service
[Service]
ExecStart=/root/test.script
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
然后我启用了脚本,
systemctl enable test
Run Code Online (Sandbox Code Playgroud)
重新启动后,脚本确实会运行,但它会在网络启动之前运行。换句话说,中的输出ip.txt显示没有分配给主接口的 IPv4 地址。到我登录时,IPv4 地址确实已分配并且网络已启动。
我猜我可以通过弄乱WantedBy参数来改变脚本运行的点,但我不知道该怎么做。
有人能指出我正确的方向吗?