我有一个~/.config/systemd/user/example.service像这样的用户服务:
[Unit]
Description=Example service
After=network.target
[Service]
ExecStart=/bin/bash -c 'host google.com > /var/tmp/example'
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
当然,我试图控制的实际服务确实做了一些有用的事情并访问网络;这只是一个简化的例子。
该服务是通过systemctl --user enable example.service它创建~/.config/systemd/user/default.target.wants/example.service指向的符号链接启用的~/.config/systemd/user/example.service。
使用此设置,并systemd按照Arch Wiki 中所述启用用户会话,服务在启动时以我的用户身份启动。但是,实际上并没有在网络建立之后启动;相反,它似乎立即开始,因为/var/tmp/example包含:
;; connection timed out; no servers could be reached
Run Code Online (Sandbox Code Playgroud)
(而且我试图控制的实际服务也无法访问网络,并因类似的名称查找错误而失败)
这意味着该服务实际上并不在network.target. 我如何让它network.target在运行前等待?
我试图让 systemd 做 init.d 脚本会做的事情,在手动给出启动或停止命令后自动显示服务的状态。这有可能吗?
不幸的是,systemd 会立即弹出,因为它在后台运行,然后您必须执行第二个命令来显示状态,启动或停止可能有效,也可能无效,除非您询问并让您幸福地无知,否则 systemd 不会告诉您。
IE。我想得到
service nginx status
在我做完之后自动运行
service nginx start
或者
service nginx restart
(或在大脑受损的 systemd 中, systemctl start nginx.service)
我有一个backup.service每小时调用一次backup.timer。不幸的是,在容器内运行的备份脚本可以成功完成,但警告返回非零退出代码。因此,尽管一切可能都有效,但容器会以非零退出代码停止。因此机组进入故障状态。
在这种情况下,计时器似乎不会再次启动该单元,尽管我在 systemd 文档中没有找到任何内容。
明确地说:对我来说,让容器以非零退出代码停止是完全可以的。但是我的计时器不起作用。
我现在可以将该脚本封装到另一个称为 als docker 入口点的脚本中。但我必须确保以某种方式保留输出 auf STDOUT 和 STDERR。
我也可以在单元失败后运行sudo systemctl reset-failed,但这对我来说似乎有点麻烦......(我试过了,在那种情况下计时器再次运行了单元。但它不能作为 ExecStopPost -服务文件中的任务)
有没有更好的方法来确保一个单位
是否可以更改 systemd 托管服务用于日志记录的标签?例如,我的自定义服务report-daemon.service定义为
# ...
[Service]
ExecStart=/usr/bin/php # ...
# ...
Run Code Online (Sandbox Code Playgroud)
显示为php而不是report-daemon(似乎从 推断标签ExecStart)
$ sudo journalctl --unit report-daemon
# ...
May 30 16:26:11 delta php[994]: Found 0 new revisions for Ctytn4a6zjw
May 30 16:26:12 delta php[994]: Found 0 new revisions for efE8xuvUjAo
# ...
Run Code Online (Sandbox Code Playgroud)
手册页没有列出在单元文件中设置它的任何选项。是否可以在某处更改标签?
journalctl允许我过滤优先级 ( -p) 并对输出中的优先级进行颜色编码。但是有没有办法让它直接输出优先级,作为文本?
我尝试启用IP转发(间enp0s3和tun0接口),并写net.ipv4.ip_forward = 1在/etc/sysctl.conf。重启后我有
$ cat /proc/sys/net/ipv4/ip_forward
1
Run Code Online (Sandbox Code Playgroud)
但是转发还是不行。我尝试添加net.ipv4.conf.default.forwarding=1在/etc/sysctl.conf。现在重启后我有
$ cat /proc/sys/net/ipv4/ip_forward
1
$ cat /proc/sys/net/ipv4/conf/default/forwarding
1
$ cat /proc/sys/net/ipv4/conf/all/forwarding
1
$ cat /proc/sys/net/ipv4/conf/enp0s3/forwarding
0
$ cat /proc/sys/net/ipv4/conf/tun0/forwarding
0
Run Code Online (Sandbox Code Playgroud)
我无法启用/proc/sys/net/ipv4/conf/enp0s3/forwarding和输入/proc/sys/net/ipv4/conf/tun0/forwarding,sysctl.conf因为这些文件在这么早的启动时间不存在:
systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/enp0s3/forwarding', ignoring: No such file or directory
systemd-sysctl[85]: Couldn't write '1' to 'net/ipv4/conf/tun0/forwarding', ignoring: No such file or directory)
Run Code Online (Sandbox Code Playgroud)
,更多的tun0是动态接口(可以随时添加和删除)。
如果我手动启用转发enp0s3,tun0然后转发按预期工作。
那么,如何正确开启接口转发呢? …
我们通过 SaltStack 部署和更改系统服务文件。
例如,如果文件/etc/systemd/system/superfoo.service被更改,则 systemd 会发出以下警告:
Warning: Unit file of superfoo.service changed on disk,
'systemctl --system daemon-reload' recommended.
Run Code Online (Sandbox Code Playgroud)
如何使用 salt-stack 自动执行此操作?
当我做一个时,journalctl --disk-usage它说日志文件的大小大约为300MB,但是当我查看实际文本时,journalctl | wc -c它大约为28MB。嗯,journald 有压缩,甚至考虑到元数据,如时间戳、uid、消息哈希等,在我看来,这似乎是对磁盘空间的荒谬浪费。
有人能告诉我为什么日志文件与里面的实际文本相比如此之大吗?
我正在尝试使用类似问题的答案来设置用户级服务。我已经创建了所需的文件并重新启动。
我正在取得进展,因为我现在收到“无法获得 D 总线连接:权限被拒绝”,而“无法获得 D 总线连接:连接被拒绝”,但我很困惑,因为我不知道是什么对象它正在尝试访问(文件?套接字?),因此甚至无法检查当前权限。有任何想法吗?
到目前为止,我已经添加了:
loginctl enable-linger userservice
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=D-Bus User Message Bus
Requires=dbus.socket
[Service]
ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
[Install]
Also=dbus.socket
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=D-Bus User Message Bus Socket
[Socket]
ListenStream=%t/bus
ExecStartPost=-/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus
[Install]
WantedBy=sockets.target
Also=dbus.service
Run Code Online (Sandbox Code Playgroud)
[Unit]
Description=Test user-level service
[Service]
Type=dbus
BusName=com.wtf.service
ExecStart=/home/userservice/userservice.py
Restart=on-failure
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
没有在别处添加任何链接...
让它失败:
systemctl --user status
Run Code Online (Sandbox Code Playgroud)
编辑 2018-10-25:
添加export XDG_RUNTIME_DIR=/run/user/$(id -u) …
在我的一台服务器 Debian 9 上,没有来自sshdin 的输出/var/log/auth.log。事实上,如果我这样做ag sshd的/var/log,它只是不会出现。里面唯一的东西auth.log是systemd-logind. 事实上,几乎所有的日志消息都来自 systemd 是很可疑的。只有零星的少数来自其他事物。
这是我的/etc/rsyslog.conf(减去评论)(它应该是默认值):
module(load="imuxsock") # provides support for local system logging
module(load="imklog") # provides kernel logging support
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$WorkDirectory /var/spool/rsyslog
$IncludeConfig /etc/rsyslog.d/*.conf
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\ …Run Code Online (Sandbox Code Playgroud)