标签: systemd

systemd 如何在以不同用户身份启动服务之前以 root 身份运行命令?

我在带有以下 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 身份执行操作?

fedora service svnserve systemd

10
推荐指数
1
解决办法
2万
查看次数

这个变量转义如何在 systemd 单元文件中工作?

我有一个相当简单的单元文件,用于我在 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)

bash systemd coreos

10
推荐指数
1
解决办法
5010
查看次数

Systemd 不会重启服务,尽管 Restart=always

这是我的 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)

fault-tolerance systemd

10
推荐指数
1
解决办法
9738
查看次数

如何限制由 systemd 管理的服务的内存

我知道 ulimit 并且我知道如何限制我明确启动或开始使用脚本的进程的内存。但在这种情况下,我有一个由 systemd 管理和启动的服务。

当它达到内存使用量最大值时,如何限制它的最大内存并杀死它(或者甚至更好:防止它分配内存(返回 NULL 到malloc/ realloc))?

linux systemd

10
推荐指数
2
解决办法
2万
查看次数

在 RHEL7 上如何区分崩溃和重启?

有没有办法确定RHEL7服务器是否通过systemctl(或reboot / shutdown别名)重新启动,或者服务器是否崩溃?Pre-systemd 这很容易用 确定last -x runlevel,但用 RHEL7 就不太清楚了。

server-crashes system-monitoring systemd rhel7

10
推荐指数
3
解决办法
7272
查看次数

systemd:如何有选择地禁用特定 WLAN 接口的 wpa_supplicant?

在 Linux 系统上systemdnetworkd我需要在一个 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 请求方服务而不全局禁用它?

debian linux-networking systemd

10
推荐指数
2
解决办法
2万
查看次数

如何通过journalctl合并多个期刊的输出?

我需要查看所有 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)

systemd

9
推荐指数
1
解决办法
3813
查看次数

SaltStack:如果服务文件被更改,则执行`systemctl --system daemon-reload`

我们通过 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 自动执行此操作?

systemd saltstack

9
推荐指数
2
解决办法
9262
查看次数

为什么日志日志文件如此庞大?

当我做一个时,journalctl --disk-usage它说日志文件的大小大约为300MB,但是当我查看实际文本时,journalctl | wc -c它大约为28MB。嗯,journald 有压缩,甚至考虑到元数据,如时间戳、uid、消息哈希等,在我看来,这似乎是对磁盘空间的荒谬浪费。

有人能告诉我为什么日志文件与里面的实际文本相比如此之大吗?

logging systemd journald

9
推荐指数
2
解决办法
3173
查看次数

由于“无法获得 D-bus 连接:权限被拒绝”,无法使用 `systemctl --user`

我正在尝试使用类似问题的答案来设置用户级服务。我已经创建了所需的文件并重新启动。

我正在取得进展,因为我现在收到“无法获得 D 总线连接:权限被拒绝”,而“无法获得 D 总线连接:连接被拒绝”,但我很困惑,因为我不知道是什么对象它正在尝试访问(文件?套接字?),因此甚至无法检查当前权限。有任何想法吗?

到目前为止,我已经添加了:

loginctl enable-linger userservice
Run Code Online (Sandbox Code Playgroud)

/usr/lib/systemd/user/dbus.service (-rw-r--r-- root root)

[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)

/usr/lib/systemd/user/dbus.socket (-rw-r--r-- root root)

[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)

/home/userservice/.config/systemd/user/userservice.service

[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) …

dbus systemd systemctl

9
推荐指数
3
解决办法
3万
查看次数