老实说,我对使用 systemd 感到一点不舒服。我就是无法理解。
我使用的fail2ban版本在我的Ubuntu 16.04中表现得很奇怪。我删除了它:
apt remove fail2ban
Run Code Online (Sandbox Code Playgroud)
并安装了最后一个:
wget https://github.com/fail2ban/fail2ban/archive/0.11.zip
unzip 0.11.zip
cd fail2ban-0.11
python setup.py install
Run Code Online (Sandbox Code Playgroud)
在安装结束时,它说我必须启用它的服务。
我以为
systemctl enable fail2ban.service
Run Code Online (Sandbox Code Playgroud)
足够了,但服务似乎被“掩盖”了。我使用此链接:https://askubuntu.com/questions/710420/why-are-some-systemd-services-in-the-masked-state 来了解 masked 是什么。
我试图揭开它的面具:
systemctl unmask fail2ban.service
并启用它:
systemctl enable fail2ban.service
Run Code Online (Sandbox Code Playgroud)
现在是经典命令:
service fail2ban status | start | stop
Run Code Online (Sandbox Code Playgroud)
工作中。
问题是,我读到我也应该能够从 systemctl 获取服务的信息:
systemctl fail2ban status
Unknown operation fail2ban.
Run Code Online (Sandbox Code Playgroud)
所以我开始谷歌搜索结果......我找到了这个命令(并且我添加了 | sort 以获得更好的输出):
systemctl list-units | sort
Run Code Online (Sandbox Code Playgroud)
这表明:
fail2ban.service loaded active exited LSB: Start/stop fail2ban
Run Code Online (Sandbox Code Playgroud)
我不知道“退出”是什么意思,所以我搜索: https ://unix.stackexchange.com/questions/241970/what-does-status-active-exited-mean-for-a-custom-service
状态活动(退出)意味着 systemd 已成功运行命令,但它不知道有一个守护进程需要监视。
我的请求: …
我尝试使用以下方法将 NiFi 作为启动服务运行:
sudo systemctl enable nifi.service
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
nifi.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nifi
update-rc.d: error: nifi Default-Start contains no runlevels, aborting.
Run Code Online (Sandbox Code Playgroud)
本教程建议对 shell 文件进行更改,但我不使用这样的文件。任何帮助,将不胜感激。
我想在每次启动服务之前执行一个脚本。
我知道我可以ExecStartPre在服务定义文件内部使用,但我想知道是否可以在不编辑来自服务包的文件的情况下实现。
该脚本是一个简单的命令,完成后退出,它创建主服务使用的文件(它从安全存储中获取 TLS 证书和密钥)。
有一个守护进程可以从命令行和 systemctl 启动。
/etc/systemd/system/mydaemon.service 包含 ExecStart= 和 PIDFile= 所以 Systemd 可以肯定地检测到该服务是否正在运行:
[Unit]
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mydaemon --no-fork
PIDFile=/var/run/mydaemon-%i.pid
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
为什么“systemctl status mydaemon”说守护程序即使正在运行也已停止?
如何教 systemd 守护进程不仅可以通过“systemctl start”运行,还可以直接运行?
我想iptables通过iptables-save代替ufwor保存的良好的老式命令来管理我的防火墙firewalld。对于 RHEL,有一个简洁的小包iptables-services可以做到这一点。(请参阅此处)对于 Debian,似乎没有。
我只是可以打iptables-restore </etc/default/iptables进去/etc/rc.local然后离开它,但我想要一个更干净的设置。如果它可以作为 systemctl 单元出现,那将是理想的。
环境: CentOS 8、Node.js、Digital Ocean Droplet
我的 Systemd 设置使用以下命令启动节点应用程序。它按预期工作。
$ sudo systemctl start myapp
Run Code Online (Sandbox Code Playgroud)
文件 1: /etc/systemd/system/myapp.service
[Unit]
Description = My App
After = network.target
[Service]
ExecStart = /root/start-myapp.sh
Restart=on-failure
[Install]
WantedBy = multi-user.target
Run Code Online (Sandbox Code Playgroud)
文件2: /root/start-myapp.sh
#!/bin/sh
/usr/bin/node /srv/myapp/app.js
Run Code Online (Sandbox Code Playgroud)
但是,当我不使用 Systemd 时,我通常会使用命令npm start. 我宁愿让 Systemd 单元也用npm start.
不幸的是扔了一个错误,当我换app.js到npm start的/root/start-myapp.sh,
/usr/bin/node /srv/myapp/npm start
Run Code Online (Sandbox Code Playgroud)
我通过从切换路径作了一次尝试node来npm,但它产生的同样的错误。
/usr/bin/npm /srv/myapp/npm start
Run Code Online (Sandbox Code Playgroud)
问题:如何让我的 Systemd 单元文件使用命令启动我的应用程序npm start?
我已经设置了许多自定义 systemd 服务单元,它们的环境变量中可能包含敏感数据。虽然非 root 用户无法使用systemctl cat该服务,但任何人都可以通过systemctl show. 这是不希望的,因为其他用户不应读取该数据。/etc/systemd/system 中的 *.service 文件被标记为只能由 root 读取(模式 600)。
我找不到任何有关 systemd 访问限制的信息。这可能吗?或者所有 systemd 数据都被认为是公开的并且全世界都可读吗?如果没有可用的安全性,我想我将不得不停止使用 systemd 功能并将所有内容包装在另一层无法访问的脚本文件中。
我当前的环境是Ubuntu Server 16.04和20.04。
前几天我在 RHEL7.1 系统上,我想在所有 systemd 单元文件所在的 /usr/lib/systemd/system 目录中搜索特定词。我像往常一样使用 grep 命令。看看发生了什么:
# cd /usr/lib/systemd/system
# grep After *
grep: invalid option -- '.'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了 RHEL7.0、RHEL7.2、RHEL7.3 并得到了相同的结果。如果我在任何其他目录中使用 grep 命令,一切正常。谁能告诉我为什么我会有这种奇怪的行为?