tl; dr: systemd 重新启动崩溃的服务数天,然后突然停止。
我有一个服务配置如下:
[Unit]
[Service]
Restart=always
RestartSec=2
StartLimitIntervalSec=0
ExecStart=/usr/local/bin/node --max-old-space-size=4096 /home/somewhere/something.js
StandardOutput=null
StandardError=null
KillMode=process
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
此代码有时会崩溃(每天 1-2 次),因此需要Restart=always. 然而,有时此服务不会重新启动,这是以下输出systemctl status:
Loaded: loaded (/home/somewhere/something-systemd.service; bad; vendor preset: enabled)
Active: inactive (dead) (Result: exit-code) since Mon 2017-12-04 10:10:46 CET; 7s ago
Process: 333 ExecStart=/usr/local/bin/node --max-old-space-size=4096 /home/somewhere/something.js (code=exited, status=1/FAILURE)
Main PID: 333 (code=exited, status=1/FAILURE)
Run Code Online (Sandbox Code Playgroud)
我的配置有错误吗?无论如何,我如何强制 systemd 重新启动服务?
该盒子是一个 debian 稳定版(截至目前)。我遇到的问题是systemctl无法查询用户服务管理器。对于命令,
systemctl --user
Run Code Online (Sandbox Code Playgroud)
错误信息是:
Failed to list units: Process org.freedesktop.systemd1 exited with status 1
Run Code Online (Sandbox Code Playgroud)
对于命令
systemctl --user status
Run Code Online (Sandbox Code Playgroud)
错误信息是:
Failed to read server status: Input/output error
Run Code Online (Sandbox Code Playgroud)
另一方面,一切看起来都很好,没有失败的服务,并且user@1000.service按预期工作。基本上所有用户单元都在正常运行,但我无法通过systemctl界面与它们交互。
许多人有相似的症状,但都有不同的问题。试图重新启动机器,但没有帮助。
我的问题是:我应该如何调试用户 systemctl 会话?上述信息过于笼统,无法确定实际问题。
提前致谢。
有时一个服务会启动并分叉 - 给 systemd 一个它已经准备好的错觉 - 即使它还没有完成“预热”。在这个特定的实例中,我使用 ApacheDS 来提供 LDAP 服务。当这个单元启动时,检查“systemctl status apacheds”将显示它正在运行,以及单个日志行:
4 月 4 日 15:34:33 daisy systemd[1]:启动 Apache Directory Server。
但是……它还没有服务。直到端口测试(如“lsof -i :389”或“netstat -pan | grep :389 | grep LISTEN”)显示存在活动侦听器,否则没有可用的 LDAP。
无论是否应该这样做 - 这需要大约 2 分钟才能完全启动。我的问题不是 ApacheDS 是坏了还是应该更换——而是如何处理 systemd 中的慢速初始化服务。
有没有办法将这样的测试放入 systemd 中,要么告诉它等待有效以显示 apacheds 服务已启动,要么将其作为依赖服务的先决条件,而不会让它们简单地失败并仍然拒绝启动?
这是一个有效的测试脚本:
#!/bin/bash
TRIES=30
WAIT=10
while /bin/netstat -an | /bin/grep \:10389 | /bin/grep LISTEN ; [ $? -ne 0 ]; do
let TRIES-=1
if [ $TRIES -gt 1 ]; then
sleep $WAIT
fi …Run Code Online (Sandbox Code Playgroud) 我需要覆盖systemd模板的ExecStartParameter。我已经确认单元文件存在并通过验证。添加unique-name@.service.d/override.conf文件在某些机器上运行良好:
user@prod-west-1604$ systemctl --version | head -1
systemd 229
user@prod-west-1604$ file -b /etc/systemd/system/unique-name@.service
symbolic link to /lib/systemd/system/nginx.service
user@prod-west-1604$ sudo systemctl edit unique-name@.service
# (opens editor as expected)
Run Code Online (Sandbox Code Playgroud)
但是,在运行较新 systemd 版本的机器上,操作失败:
user@prod-east-1810$ systemctl --version | head -1
systemd 239
user@prod-east-1810$ file -b /etc/systemd/system/unique-name@.service
symbolic link to /lib/systemd/system/nginx.service
user@prod-east-1810$ sudo systemctl edit unique-name@.service
Failed to get the load state of unique-name@.service: Unit name unique-name@.service is neither a valid invocation ID nor unit name.
Run Code Online (Sandbox Code Playgroud)
为什么 …
我正在从 docker 迁移到 podman(不直接迁移到 kubernetes,因为在这一点上这肯定是矫枉过正的)。
现在,许多优雅的配置都可以作为 docker-compose 设置——但是 docker-compose 依赖于 docker 守护进程来启动(并保持运行)相互依赖的容器。
podman 的做法是让 systemd 单元文件相互依赖,并让 systemd 进行监控和启动(和关闭)。
现在,手动将 docker-compose 设置转换为单元文件很容易出错,而且有点乏味。
是否有一个已知的 docker-compose 兼容阅读器的已知来源,我可以设置它来生成 systemd 单元文件?
我正在使用带有 systemd 的 Ubuntu 18.04 服务器。最近我部门开发的一个程序一天内崩溃了两次,错误如下:
Jun 07 06:33:07 xxx systemd[1]: xxx.service: Main process exited, code=killed, status=11/SEGV
Jun 07 06:33:07 xxx systemd[1]: xxx.service: Failed with result 'signal'.
Run Code Online (Sandbox Code Playgroud)
我认为下一步是获取回溯或核心转储,但是我不确定如何在带有 systemd 的 Ubuntu 服务器上执行此操作。
我不知道我是否应该追求使用systemd-coredump,coredumpctl或者一些其他的工具。
另外,我不确定要发出什么命令。对于上述实用程序,有大量关于各种功能等的文档,但我找不到以下方面的简明示例:
sudo apt-get install xyz
(run x, y, z commands to get core dump)
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一个简洁的示例或教程网站来很好地解释这一点吗?我不需要或不想使用各种精心设计的功能,我只是想获得一个基本的核心转储。
我很难理解日志是如何在 linux 上工作的。
自从加入了systemd,看起来容易了一些,但是我还有几个概念还是不能完全理解。
给定一个带有 journalctl 的系统,我想向远程主机发送一些日志消息。为此,我安装了 rsyslog 并配置了 freeradius,以便将其日志输出到 local3,然后将 rsyslog 配置为将 local3 下的这些消息转发到远程 syslog 服务器。现在,系统日志是否在 rsyslog 和 journalctl 之间共享?这会导致任何形式的冲突吗?
除此之外:谁控制写入/var/log/messages 的内容?某个应用程序如何将其日志输出到此文件?它是由 rsyslog 管理的吗?通过系统?
如果有人能帮我理解整个 linux 日志服务,那就太好了。
我正在阅读有关的联机帮助页systemctl reload,发现这句话是关于reload.
reload PATTERN...
Asks all units listed on the command line to reload their
configuration.
Run Code Online (Sandbox Code Playgroud)
http://man7.org/linux/man-pages/man1/systemctl.1.html
systemd 是如何做到的?systemd 使用什么 API 来要求单元重新加载其配置?
我也发现了reload-or-restart。
reload-or-restart PATTERN...
Reload one or more units if they support it. If not, restart them
instead.
Run Code Online (Sandbox Code Playgroud)
systemd 如何知道单元是否支持重新加载?
我安装了 Debian 10 (Buster) 并从 Backports 添加了 ZFS。我有 4 个 iSCSI-LUN,用作 ZFS 的磁盘。每个 LUN 都有一个单独的 zpool。
到目前为止,ZFS 设置有效。但是系统不是重启稳定的。有时重新启动后,所有 ZFS 卷都会恢复并正确安装,有时则不会。我认为会发生这种情况,因为 ZFS 不会等待 iSCSI 完成。
我试过:
/etc/systemd/system/zfs-import-cache.d/after-open-iscsi.conf
[Unit]
After=open-iscsi.service
BindsTo=open-iscsi.service
Run Code Online (Sandbox Code Playgroud)
systemd-analyze 关键链 zfs-import-cache.service
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.
zfs-import-cache.service +1.602s
??open-iscsi.service @2min 1.033s +286ms
??iscsid.service @538ms +72ms
??network-online.target @536ms
??ifup@eth0.service @2min 846ms
??apparmor.service @2min 748ms +83ms
??local-fs.target @2min …Run Code Online (Sandbox Code Playgroud) 我正在尝试为一个简单的 React 应用程序设置一个 systemd 服务。此应用程序托管在 /home/myuser/test 中。npm 和 node 都在 PATH 中并且硬链接到 /usr/bin。所有文件都具有 myuser:myuser 用户和组的权限。如果我手动启动它,npm start它会正确启动并从http://localhost:3000
Compiled successfully!
You can now view test in the browser.
Local: http://localhost:3000
On Your Network: http://myipaddress:3000
Note that the development build is not optimized.
To create a production build, use npm run build.
Run Code Online (Sandbox Code Playgroud)
如果我尝试通过 systemd 启动应用程序,它会失败但没有说明原因。我从相同的路径、相同的用户启动它,并尝试了 ExecStart 可以想象的所有组合:
ExecStart=npm start
ExecStart=/usr/bin/npm start
ExecStart=/usr/bin/node /home/myuser/test/node_modules/react-scripts/scripts/start.js
Run Code Online (Sandbox Code Playgroud)
它们都产生相同的结果,即它“开始”正常,但很快就失败了,在 journalctl 中显然没有理由:
$sudo systemctl status node-client
? node-client.service - Node-React Frontend Server
Loaded: loaded (/etc/systemd/system/node-client.service; disabled; …Run Code Online (Sandbox Code Playgroud) systemd ×10
linux ×2
debian ×1
debugging ×1
journalctl ×1
node.js ×1
npm ×1
open-iscsi ×1
podman ×1
rsyslog ×1
syslog ×1
systemctl ×1
ubuntu-18.04 ×1
zfs ×1