我是 systemd 的新手,并试图将内部应用程序打包为 rpm,以安装在 systemd 主机(RHEL7)上。
rpm 尝试将 systemd .service-file: myapp.service 放入:/etc/systemd/system
但这会产生错误,我不明白:
file /etc/systemd from install of myapp-0:1-.i386 conflicts with file from package systemd-219-19.el7.x86_64
file /etc/systemd/system from install of myapp-0:1-.i386 conflicts with file from package systemd-219-19.el7.x86_64
Run Code Online (Sandbox Code Playgroud)
并且安装中止。
.service-file 中与安装相关的内容是:
[Unit]
Description=MyApp
After=syslog.target network.target activemq.service
Requires=activemq.service
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
...
Run Code Online (Sandbox Code Playgroud)
知道冲突可能是什么吗?
或者如何解决?
编辑:从 gradle 构建文件添加 rpm-stuff:
myappRpm {
dependsOn build
packageName 'myapp'
arch I386
os LINUX
version buildVersion
preInstall file('./deploy/rpm/preinstall')
postInstall file('./deploy/rpm/postinstall')
preUninstall file('./deploy/rpm/preuninstall')
directory('/var/log/myapp', 755)
directory('/opt/myapp/app', …Run Code Online (Sandbox Code Playgroud) 我注意到一些 systemd 文档和操作文档中关于如何配置一个或多个服务以使用相同计时器的方法的一些显着变化。
就我已经能够拼凑起来(尽管我可能是错的)这将描述服务和计时器文件中的WantedBy和Unit参数需要设置为(此处不使用实际代码示例 - 以减少发布长度)用于单个服务,相反,使用单个计时器的多个服务配置:
单个服务的定时器
My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3)
Run Code Online (Sandbox Code Playgroud)
(1)服务文件不需要带有 WantedBy 参数的 [Install] 部分。
(2)在计时器的 [Timer] 部分,Unit 参数应指向 My.Service1 服务文件。
(3)定时器文件有一个 WantedBy 参数,它指向一些将用于启动它的特殊系统目标。
多个服务的定时器
My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???
Run Code Online (Sandbox Code Playgroud)
(1)所有服务都需要使用 WantedBy 参数连接到同一个定义的目标。
(2) [Timer] Unit 参数也应该指向目标。
有关后一种配置的示例,请参阅此操作方法。我将其视为示例 1。但是,我发现了其他与此不同的操作示例(见下文)。 …
当我尝试启动/重启/停止/状态 zabbix-agent 服务时。我收到以下错误。我确切地说我已经进行了安装然后被清除 - 将其删除以安装另一个版本(升级)。从那以后我收到了这个错误:
Failed to start zabbix-agent.service: unit zabbix-agent.service is masked.
Run Code Online (Sandbox Code Playgroud) 所以我正在深入研究 systemd 的复杂性,它能够使用 cpu、io 和内存等 cgroup 来计量资源。
是否还有一种方法可以控制进程可以使用 systemd 访问的目录?例如,/usr/bin通常标记为o+rX,我希望将网络服务器进程锁定在该目录之外。已经有很多软件漏洞可以从磁盘读取任意文件,这将增强分层的安全方法。
我确信这可以通过一些非常花哨的文件系统权限来完成,但想知道是否有更好的方法。感谢服务器故障!
我一直在使用 ansible 来安装和配置多个服务,但这是我第一次尝试设置可以同时运行多个实例的服务。我正在使用服务文件的模板,如下所示:
[Unit]
Description=My Service
[Service]
WorkingDirectory=/var/lib/service/api
ExecStart=/usr/bin/python -O /var/lib/service/api/main.py -f /var/lib/service/api/cfg/service_api.cfg -p {{ port }}
Type=simple
Run Code Online (Sandbox Code Playgroud)
然后我安装和配置此服务的角色包含如下任务:
- name: Configure api.service
template: src=api.service.j2 dest=/etc/systemd/system/api@{{port}}.service
- name: Start service
systemd: name=api@{{port}} state=restarted enabled=yes
Run Code Online (Sandbox Code Playgroud)
现在这适用于 port = 80 之类的东西,但我认为我做得不够通用。我不完全了解如何创建这些实例服务。如何修改服务文件和角色,使每个侦听端口都可以拥有自己的服务文件?我应该使用“Wants”关键字还是“WantedBy=multi-user.target”之类的关键字?
我不小心systemd-private-015eb2e9f67b4eef862c68e99fe0ba30-apache2.service-9h6i08从我的 /tmp 文件夹中删除了:
sudo rm -R /tmp/systemd-private-015eb2e9f67b4eef862c68e99fe0ba30-apache2.service-9h6i08
并不意味着它不会永久消失。我确信它会再次显示回来。这使我的代码中断,因为它没有找到将文件写入其中的安全文件夹。
我如何再次返回文件?
我尝试再次创建目录 - 只有 root 权限和所有权 - 但这不起作用。
我有一个带有 3 个公共 IP 的 Ubuntu 18.04 服务器。主 IP 已经预先配置。
我想配置IP2和IP3。IP2 用于 SSL 域,IP3 用于虚拟机 (qemu libvirt)。问题(对我来说)是,以前版本的 Ubuntu 使用了 upstart,我能够配置它,但是当前版本有 systemd,我无法解决。
以前我使用以下方法进行配置并且一切正常:https : //wiki.hetzner.de/index.php/Netzkonfiguration_Debian/en#Routed_.28brouter.29
现在,使用 systemd,这是我开始使用的网络配置文件(只有 1 个 IP):
# /etc/systemd/network/10-eno1.network
[Match]
Name=eno1
[Network]
Gateway=IP_GATEWAY
[Address]
Address=IP1
Peer=IP_GATEWAY/32
Run Code Online (Sandbox Code Playgroud)
添加 IP2(用于 SSL)很容易,因为它只需要在上面的文件中添加一个额外的 [Address] 部分。
至于IP3,我想为了将IP3路由到我的VM,我需要像原始howto一样创建一个网桥。因此,当尝试为 VM 配置 qemu/libvirt 网桥时,我最终得到了与此配置非常相似的内容:https : //bbs.archlinux.org/viewtopic.php?id=193994 ie - br0 device + eno1 添加到网桥+ 像上面一样配置网桥
但是就像在上面的线程中一样,服务器变得无法访问(无法 ping 输入/输出)并且诊断命令的输出几乎相同。
关于如何配置 IP3 以与 VM 一起使用的任何建议?
我目前正在为 Ubuntu 18.04 服务器构建预配置的磁盘映像。虽然硬件基本相同,但设备之间有一些不同的网络接口(有些是虚拟机而不是裸机)。因此,我不知道事先会出现哪些网络设备或它们将被称为什么(有些有一个称为 ens33 的单一设备,其他有多个称为 eno1、eno2 等)。
systemd-networkd 不会自动打开接口,它们必须在配置文件中明确指定。
我目前正在通过使用 NetworkManager 而不是 networkd 来绕过它,因为它会自动调出它找到的任何接口,但考虑到 Ubuntu 安装程序似乎会自动将它找到的任何接口添加到 netplan 的配置中,我认为必须有一种方法来设置一个服务或在启动时做同样事情的东西。有人知道这样做的方法吗?
如何判断脚本是从 systemd 还是从用户调用的?
我为一个老式的守护进程创建了一个服务。我们刚刚切换到 systemd,我的一些管理员喜欢直接调用 rc-script。在机器重新启动的情况下,这不会很好地工作。Systemd 不会尊重 ,PIDFile=因为新启动的守护进程不是它的服务 cgroup 的一部分。
我添加了服务文件和 rc_script。我不能因用户 ID 而异,因为要使用脚本,用户必须是foobaruser.
停止服务现在有问题,因为 systemd 会从删除的 pid 文件中识别出这一点。
那么如何确定脚本是否是从 systemd 调用的呢?
[Unit]
Description=Foobar Service
After=syslog.target network.target
[Service]
Type=forking
User=foobaruser
LimitNOFILE=60000
LimitNPROC=8000
TasksMax=8000
PIDFile=/local/foobar/foo.pid
ExecStart=/opt/foobar/rc_script start
ExecStop=/opt/foobar/rc_script stop
TimeoutSec=100
TimeoutStopSec=300
KillMode=none
RemainAfterExit=no
Environment=LANG=de_DE.UTF-8
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
case $1 in
start)
VAR_IS_SYSTEMD=$( ... script to check if bash is run from systemd ... )
if [ "$VAR_IS_SYSTEMD" = false ] ; then
sudo systemctl …Run Code Online (Sandbox Code Playgroud) 我在互联网上搜索,但找不到有关INVALIDARGUMENT 的任何信息 。
在 systemd 中停止服务后,我得到了这个响应。
Oct 18 21:17:04 BSU00383 systemd: Stopping filebeat...
BUNCH OF APPLICATION ERROR HERE
Oct 18 21:17:04 BSU00383 systemd: filebeat.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Run Code Online (Sandbox Code Playgroud)
看起来应用程序端在收到来自 systemd 的SIGKILL 信号之前未能处理SIGTERM 信号,但是在什么情况下 systemd 通常会返回 INVALIDARGUMENT ?
我使用的是红帽企业 Linux 7.4。
如果有人可以帮助我,我很感激...
谢谢,
渡边优