我在带有以下 systemd 服务文件的 Fedora 17 机器上运行 svnserve:
[Unit]
Description=Subversion Server
After=syslog.target network.target
[Service]
User=svn
Type=forking
Environment=HOME=/repos/svn
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /repos/svn
PIDFile=/run/svnserve/svnserve.pid
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
只要 /var/run/svnserve 归 svn:svn 所有,这就可以正常工作,但是当该所有权重置为 root:root 时会在重新启动时中断。我想要的是添加一个 chowns 目录的预启动步骤。
不幸的是,我找不到任何关于 systemd 单元文件的真正文档,但我看到有些人在使用“ExecStartPre”,所以我尝试了这个:
ExecStartPre=/bin/chown svn:svn /run/svnserve
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这会因“不允许操作”错误而失败,因此看起来 ExecStartPre 也以单元文件中指定的用户身份运行。
我还尝试让单元文件以 root 身份运行,然后通过 su 以 svn 用户身份启动 svnserve,但这产生了一个关于命令行无效的模糊错误。
systemd 单元如何在以特定用户身份执行之前以 root 身份执行操作?
我有一个相当简单的单元文件,用于我在 CoreOS 上运行的服务器实例的发现助手服务。单元文件如下所示:
[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
while true; do \
export PORT=$(docker port frontend%i 80 | sed s/.*://); \
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
sleep 45; \
done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i
[X-Fleet]
MachineOf=frontend@%i.service
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我花了很长时间才到达这个阶段,因为如果我将etcdctl行更改为:
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Run Code Online (Sandbox Code Playgroud)
然后它不起作用 - 它最终设置了一个100.45.218.3:没有端口的值。一路上,我花了很多时间玩弄$PORT变量的不同用途,但我不知道为什么我选择的配置有效。有一次我在脚本中有这个:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \ …Run Code Online (Sandbox Code Playgroud) 这是我的 systemd 服务的单元文件:
[Unit]
Description=Tunnel For %i
After=network.target
[Service]
User=autossh
ExecStart=/usr/bin/autossh -M 0 -N -o "ExitOnForwardFailure yes" -o "ConnectTimeout=1" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 40443:installserver:40443 -R 8080:installserver:8080 tunnel@%i
Restart=always
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
该单元在 15 天前出现故障并且 systemd 没有重新启动它,尽管“Restart=always”在上面的单元文件中。
这里是这个服务的状态输出:
salt:/srv # systemctl status autossh@eins-work
autossh@eins-work.service - Tunnel For eins-work
Loaded: loaded (/etc/systemd/system/autossh@.service; enabled)
Active: failed (Result: start-limit) since Wed, 2016-02-10 14:33:34 CET; 2 weeks and 1 days ago
Main PID: 17980 (code=exited, status=0/SUCCESS)
CGroup: name=systemd:/system/autossh@.service/eins-work
Feb 10 14:33:34 salt systemd[1]: …Run Code Online (Sandbox Code Playgroud) 我知道 ulimit 并且我知道如何限制我明确启动或开始使用脚本的进程的内存。但在这种情况下,我有一个由 systemd 管理和启动的服务。
当它达到内存使用量最大值时,如何限制它的最大内存并杀死它(或者甚至更好:防止它分配内存(返回 NULL 到malloc/ realloc))?
有没有办法确定RHEL7服务器是否通过systemctl(或reboot / shutdown别名)重新启动,或者服务器是否崩溃?Pre-systemd 这很容易用 确定last -x runlevel,但用 RHEL7 就不太清楚了。
在 Linux 系统上systemd,networkd我需要在一个 WLAN 接口上运行 WLAN 接入点,同时在正常站(“客户端”)模式下运行更多(热插拔)WLAN 接口。
事实证明,wpa_supplicant.service在我所有的 WLAN 接口上都可以使用,如果所有这些 WLAN 接口都可以在工作站/客户端模式下运行,那就没问题了。但是,虽然wpa_supplicant.service提供 WLAN 接口,但不可能(不再?)hostapd.service在 AP 接入点模式下运行该 WLAN 接口。
所以我只想禁用wpa_supplicant.service特定接口,比如wls35u2. 我的想法是有一个wpa_supplicant@wls35u2.service我可以有选择地禁用但保持wpa_supplicant.service启用状态的单元。但是,这似乎不起作用,或者我在wpa_supplicant@wls35u2.service.
那么,如何仅在特定接口上禁用 WPA 请求方服务而不全局禁用它?
我需要查看所有 postgresql 日志。我尝试:
$ journalctl -f -u postgresql.service SYSLOG_IDENTIFIER=postgres
-- Logs begin at ?? 2013-03-06 00:57:40 KRAT. --
??? 11 23:41:07 nuzzflonk postgres[2432]: LOG: database system was interrupted; last known up at 2013-08-11 20:12:28 KRAT
??? 11 23:41:07 nuzzflonk postgres[2432]: LOG: database system was not properly shut down; automatic recovery in progress
??? 11 23:41:07 nuzzflonk postgres[2432]: LOG: record with zero length at 5/DACF208
??? 11 23:41:07 nuzzflonk postgres[2432]: LOG: redo is not required
??? 11 23:41:07 nuzzflonk postgres[2432]: LOG: …Run Code Online (Sandbox Code Playgroud) 我们通过 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) …