通常,用于存储 pid 或类似内容的目录是由服务的启动脚本创建的。(见这个问题)
但是,我只是注意到当我禁用这些服务时,这些目录在重新启动后仍会重新创建。我尝试过的所有服务都发生了这种情况。
root@sonorus:~# systemctl status openvpn
? openvpn.service - OpenVPN service
Loaded: loaded (/lib/systemd/system/openvpn.service; disabled)
Active: inactive (dead)
root@sonorus:~# systemctl status ejabberd
? ejabberd.service - A distributed, fault-tolerant Jabber/XMPP server
Loaded: loaded (/lib/systemd/system/ejabberd.service; disabled)
Active: inactive (dead)
Docs: https://www.process-one.net/en/ejabberd/docs/
Run Code Online (Sandbox Code Playgroud)
哪个服务实际上在创建这些目录?
systemd-analyze plot 只显示切换根发生后所有单元的时间图。交换机根单元(定义为 initrd 引导序列中的最后一个单元)状态:
[Service]
# ...
ExecStart=/usr/bin/systemctl --no-block --force switch-root /sysroot
# ...
Run Code Online (Sandbox Code Playgroud)switch-root 系统命令上的 systemctl 手册页有这样的说法:
switch-root ROOT [初始化]
切换到不同的根目录并在其下执行一个新的系统管理器进程。这旨在用于初始 RAM 磁盘(“initrd”),并将从 initrd 的系统管理器进程(又名“init”进程)过渡到从实际主机卷加载的主系统管理器进程。此调用需要两个参数:将成为新根目录的目录,以及在其下作为 PID 1 执行的新系统管理器二进制文件的路径。如果省略后者或空字符串,将自动搜索 systemd 二进制文件用于并用作初始化。如果省略系统管理器路径,等于空字符串或与 systemd 二进制文件的路径相同,则 initrd 的系统管理器进程的状态将传递给主系统管理器,这允许稍后对所涉及服务的状态进行自省在 initrd 启动阶段。
然后在 initrds 问题上保持沉默......
启动后,我如何内省 initrd 启动阶段所涉及的服务状态,如上面推断的那样,或者发现什至运行了哪些单元(因为有些是动态生成的)?
在 DigitalOcean 上升级我的 debian(测试,jessie 到拉伸)服务器后,MariaDB 不会以服务 mariadb start 启动。
我试图清除所有 mariadb-* 和 mysql-* 包,删除配置和数据,然后重新安装它们,但 mariadb-server-10.1.21-5 拒绝配置:
Setting up mariadb-server-10.1 (10.1.21-5) ...
Job for mariadb.service failed because the control process exited with error code.
See "systemctl status mariadb.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
? mariadb.service - MariaDB database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2017-02-09 21:25:27 CET; 10ms ago
Process: 1696 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION …Run Code Online (Sandbox Code Playgroud) 为什么?
我的服务是通过适当的单元文件或初始化脚本启动的。我不需要普通用户在我的服务器上做任何超出su. 我特别在寻找一种方法来完全关闭 polkit,而不会在其他服务重新启动时自行启动。
我预见到在我们的 PCI 环境中向审计员解释这一点时也会出现问题。我们必须描述每项服务的目的。我们在 PCI 环境中没有 polkit 的合法用例。
附加说明:我没有安装 polkit。这些服务器的安装非常小,大约 670MB / 这是一个 systemd 更新,似乎已经安装了 polkit 并且该规范显然依赖于所有 systemd 托管服务。安装后,我必须重建机器才能将其删除,就像nss安装后尝试删除一样。我担心的是,如果我强制 unstall,它可能会留下一些文件,这些文件会导致 systemd 假设它在那里。
我尝试过的:
创建/etc/polkit-1/rules.d/99-deny-all.rules与
polkit.addRule(function(action, subject) {
return polkit.Result.YES;
});
Run Code Online (Sandbox Code Playgroud)
然后
systemctl daemon-reload && systemctl daemon-reexec
Run Code Online (Sandbox Code Playgroud)
这什么都不做,/usr/lib/polkit-1/polkitd --no-debug当 systemd 下的其他服务重新启动时继续启动。
[更新] 正如亚历山大所提到的,重新启动 polkit 会将设置应用于 polkit 本身,这很好,但我正在寻找一种方法来告诉 polkit 不启动并且不会破坏其他服务。
[更新 2] 这实际上可能会阻止某些服务正确重新启动。
屏蔽或禁用服务:
这会导致其他服务在启动和关闭时挂起,等待 polkit。
编辑/usr/share/dbus-1/sstem-services/org.freedesktop.PolicyKit1.service:
[snip]
Exec=/bin/false
[snip]
Run Code Online (Sandbox Code Playgroud)
然后
systemctl daemon-reload && systemctl daemon-reexec
Run Code Online (Sandbox Code Playgroud)
这什么都不做,/usr/lib/polkit-1/polkitd …
我有一个systemd.socket名为gunicorn.socket,我想在远程服务器上更新一些代码后重新启动。
我已按照允许非 root 用户重新启动服务中详述的步骤操作并systemctl不断询问我的用户密码。这是我尝试systemctl restart gunicorn.socket与 user一起运行时所做的john:
# added an appadmin group to allow the restart command to john
addgroup appadmin
usermod -a -G appadmin john
visudo
Run Code Online (Sandbox Code Playgroud)
在sudoers:
Cmnd_Alias MYAPP_CMNDS = /bin/systemctl start gunicorn.socket, /bin/systemctl stop gunicorn.socket, /bin/systemctl restart gunicorn.socket
%appadmin ALL=(ALL) NOPASSWD: MYAPP_CMNDS
Run Code Online (Sandbox Code Playgroud)
然后sudo systemctl restart gunicorn.socket在服务器上工作正常,但是当我远程尝试时,我得到:
ssh example.com "sudo systemctl restart gunicorn.socket"
Failed to restart gunicorn.socket: Interactive authentication required.
See …Run Code Online (Sandbox Code Playgroud) (systemd 版本 229,fwiw)
我有一个主要服务 A 和一个辅助服务 B。主要 A 可以自己运行。但是服务 B 本身无法正确运行:它需要 A 运行(技术上 B 可以运行,但这是我希望 systemd 阻止的)。我的目标:如果 A 没有运行,B 就不应该运行。鉴于 A 和 B 正在运行,当 A 停止或死亡/崩溃时,B 应该停止。
我如何实现这一目标?
我通过将 [Unit] 项目添加到 b.service 来接近,使用
Requisite=A.service
After=A.service
Run Code Online (Sandbox Code Playgroud)
上面的结果是
1) B won't start unless A is running (good).
2) B is stopped when A is stopped (good).
3) However, if I kill A, service B continues to run (bad).
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个最后的行为 #3?我尝试使用 BindsTo 而不是 Requisite,就像在 B 的服务文件中这样:
BindsTo=A.service
After=A.service
Run Code Online (Sandbox Code Playgroud)
我得到:
1) If …Run Code Online (Sandbox Code Playgroud) 我有这个 systemd 文件:
[Unit]
Description=something website
After=syslog.target
Requires=postgresql.service
[Service]
ExecStart=/home/my_user/my_webapp/bin/ foreground
ExecStop=/home/my_user/my_webapp/bin/ stop
Restart=on-abort
WorkingDirectory=/home/my_user/my_webapp/bin
SyslogIdentifier=my_webapp_web_app
User=my_user
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
如您所见,“my_webapp”和“my_user”重复了很多次。有没有办法将它们存储到变量中并使用变量代替?
如果 MongoDB 3.6 崩溃,它似乎不会自动配置为重新启动。查看与 Ubuntu 16.04LTS 的最新 .deb 包捆绑在一起的 systemd 服务,它似乎没有配置重启:
$ sudo systemctl cat mongod
# /lib/systemd/system/mongod.service
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual
[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
PIDFile=/var/run/mongodb/mongod.pid
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
发送 SIGKILL 和 SIGSEGV 都会终止进程并且不会重新启动。我不确定这些是否被 …
我正在部署Goldfish,它是Vault 的一个接口,在专用于机密管理的服务器上进行生产。因此,安全是这里的首要问题。
我正在尝试在 Unbuntu 16.04 系统上使用 systemd 部署服务,为其提供尽可能少的权限。我希望它以非 root 用户身份运行goldfish并侦听端口 443。我尝试了多种选择。
解决方法1:使用systemd插座,在多个帖子建议我发现如这一个(金鱼后端写在去,因为在后)。这似乎是最精确和最安全的,因为它完全由 systemd 管理并为单个服务打开一个端口。我的单元文件如下所示:
/etc/systemd/system/goldfish.socket:
[Unit]
Description=a Vault interface
[Socket]
ListenStream=443
NoDelay=true # Tried with false as well
Run Code Online (Sandbox Code Playgroud)/etc/systemd/system/goldfish.service:
[Unit]
Description=a Vault interface
After=vault.service
Requires=goldfish.socket
ConditionFileNotEmpty=/etc/goldfish.hcl
[Service]
User=goldfish
Group=goldfish
ExecStart=/usr/local/bin/goldfish -config=/etc/goldfish.hcl
NonBlocking=true # Tried with false as well
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)不幸的是,我得到一个“listen tcp 0.0.0.0:443: bind: permission denied”。所以看起来它仍然没有得到想要的权限,这似乎违背了为服务创建套接字的目的。我在这里缺少什么?
解决方案 2:为服务提供 CAP_NET_BIND_SERVICE 能力。这次我没有使用 systemd 套接字,而是使用AmbientCapabilities服务中的设置(也尝试使用CpabilityBoudingSet和Capabilities,后者令人惊讶地未在 …
今天和昨天,我的服务器自动重启,在启动过程中无法启动网络设备。如果我再次重新启动机器,它就会正常启动,在过去的 2 个月里我也没有遇到任何问题。
我能找到的与此相关的唯一错误日志是:
Aug 23 06:37:14 server systemd[1]: Started ifup for ens16.
Aug 23 06:37:14 server systemd[1]: ifup@ens16.service: Main process exited, code=exited, status=1/FAILURE
Run Code Online (Sandbox Code Playgroud)
和
Aug 23 06:37:14 server sh[281]: iptables-restore: line 10 failed
Aug 23 06:37:14 server systemd[1]: ifup@ens16.service: Main process exited, code=exited, status=1/FAILURE
Aug 23 06:37:14 server sh[281]: run-parts: /etc/network/if-pre-up.d/iptables exited with return code 1
Aug 23 06:37:14 server sh[281]: ifup: failed to bring up ens16
Run Code Online (Sandbox Code Playgroud)
/etc/network/if-pre-up.d/iptables 包含:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
Run Code Online (Sandbox Code Playgroud)
/etc/iptables.up.rules 包含:
*filter
:INPUT ACCEPT [0:0] …Run Code Online (Sandbox Code Playgroud)