我有几个 python 网络服务,我试图在 Fedora 15 机器上运行。它们由 Paster 运行,启动它们的唯一区别是它们读取的配置文件。
这似乎很适合 systemd 的实例化服务,但我希望能够将它们作为一个单元进行控制。需要这两种服务的 systemd 目标似乎是解决这个问题的方法。启动目标确实会启动这两个服务,但停止目标会使它们继续运行。
这是服务文件:
[Unit]
Description=AUI Instance on Port %i
After=syslog.target
[Service]
WorkingDirectory=/usr/local/share/aui
ExecStart=/opt/cogo/bin/paster serve --log-file=/var/log/aui/%i deploy-%i.ini
Restart=always
RestartSec=2
User=aui
Group=aui
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
这是目标文件:
[Unit]
Description=AUI
Requires=aui@5001.service
Requires=aui@5002.service
After=syslog.target
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
systemd 甚至可以进行这种分组吗?
我的单元文件看起来像这样(已经\x20像文档所说的那样尝试转义空格):
[Unit]
Description=My Service
[Service]
Type=simple
WorkingDirectory=/home/cobra/my\x20service/
ExecStart=/home/cobra/my\x20service/start.sh
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
但是当尝试启动它时,它失败并显示以下消息:
Failed at step CHDIR spawning /home/cobra/my service/start.sh: No such file or directory
myservice.service: main process exited, code=exited, status=200/CHDIR
Run Code Online (Sandbox Code Playgroud)
给出从此错误消息stat返回的路径:
File: ‘/home/cobra/my service/start.sh’
Size: 280 Blocks: 8 IO Block: 4096 regular file
Device: 903h/2307d Inode: 4718912 Links: 1
Access: (0754/-rwxr-xr--) Uid: ( 1000/ cobra) Gid: ( 1000/ cobra)
Access: 2015-05-24 22:42:12.702657594 +0200
Modify: 2015-03-27 22:28:05.682531000 +0100
Change: 2015-05-24 22:40:58.830298787 +0200
Birth: -
Run Code Online (Sandbox Code Playgroud)
我无法从文件名中删除空格,因为我尝试运行的服务出于某种原因需要它们。
我哪里错了?
我有三个 systemd 服务(Docker 容器,但这并不重要)。所有这三个服务都必须运行,应用程序才能完全正常运行。
为了简化操作团队的程序,我创建了第四个 systemd 服务,使用RequiresandPartOf指令将它们组合在一起。启动和停止这第四个服务现在将以正确的顺序启动和停止三个容器。
最后一个挑战是让第四个 systemd 服务显示正确的状态。现在它在启动服务后显示“加载/非活动”。是否可以将其配置为当且仅当三个第一个服务启动并运行时才显示“已加载/活动”?
[Unit]
Description=This is the group
Requires=a.service b.service c.service
[Service]
ExecStart=/bin/echo "Starting"
ExecStop=/bin/echo "Stopping"
[Install]
WantedBy=local.target
Run Code Online (Sandbox Code Playgroud)
的a.service,b.service并c.service含有PartOf=group.service
我想指示 systemd 在指定的、预先存在的网络命名空间中“运行单元”,特别是在命名空间中启动单元的进程。
当特定的 systemd 服务停止时,如何确保遵循特定的顺序?我有几个正在运行的 systemd 服务/单元,但使用了各种挂载分区上的资源。这些分区使用自定义服务挂载和卸载。在自定义挂载程序停止之前,需要按特定顺序停止正在运行的服务(例如 ProgramA.service 和 ProgramB.service)。
设置启动依赖项相当简单,但我一直无法弄清楚如何确保在我的挂载服务停止之前停止服务。
mountCustomPartitions.service
[Unit]
Description=My Custom Partition Mounting Service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/mountCustomPartitions.sh mount
ExecStop=/usr/bin/mountCustomPartitions.sh unmount
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
程序A.服务
[Unit]
Description=My Generic Program A Service
Wants=mountCustomPartitions.service
After=mountCustomPartitions.service
[Service]
Type=simple
ExecStart=/usr/bin/ProgramA
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
程序B.服务
[Unit]
Description=My Generic Program B Service
Requires=ProgramA.service
Wants=mountCustomPartitions.service
After=mountCustomPartitions.service ProgramA.service
[Service]
Type=simple
ExecStart=/usr/bin/ProgramB
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
在我上面的场景中, mountCustomPartitions.service 必须在程序服务之前启动,但也必须在它们之后停止。如果 mountCustomPartitions.service 被明确停止,那么它应该导致其他人也停止(但必须等待它们被停止)。我还需要确保 ProgramB 在 ProgramA 之后启动,但也在 ProgramA 之前停止。希望这不会太令人困惑。
我能想到的唯一解决方案是让每个服务都有一个 ExecStop 行,该行为特定服务执行systemctl stop [service]命令,该服务必须在停止之前停止。我遇到的问题是我实际上目前有六个服务使用已安装的分区,并且必须在尝试卸载之前停止。在这六个中,有些需要按特定顺序停止。由于这是用于商业产品,我希望有一个更清洁的解决方案。
我正在尝试在 CentOS 7 上的 systemd 中创建重复的 httpd 服务(为什么?见底部)
这是我到目前为止所做的:
#Copy all the files
cp -pr /etc/httpd /etc/httpd-bobby
cp /usr/lib/systemd/system/httpd.service /usr/lib/systemd/system/httpd-bobby.service
cp /etc/sysconfig/httpd /etc/sysconfig/httpd-bobby
#Just replace /etc/sysconfig/httpd with /etc/sysconfig/httpd-bobby
pico /usr/lib/systemd/system/httpd-bobby.service
#Changed port and file locations
pico /etc/httpd-bobby/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我失败了,这是:
[root~]# systemctl status httpd-bobby.service
httpd-bobby.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd-bobby.service; disabled)
Active: failed (Result: exit-code) since Tue 2016-06-21 17:38:33 BST; 6h ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 21777 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
Process: 21775 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS) …Run Code Online (Sandbox Code Playgroud) 我一直在开发一个 systemd 服务来包装管理脚本,我正在尝试优雅地处理它完全中断。
现在我已经Restart设置为always所以当出现故障时它会再次尝试,但一些故障状态需要注意(缺少配置文件、错误的 SQL 等),所以我不希望它在不可纠正的状态下在后台持续旋转。
我发现StartLimitInterval, StartLimitBurst, 和StartLimitAction在 Y 秒内 X 次失败后停止尝试重新启动它,但事实证明,唯一可用的操作StartLimitAction是重新启动或关闭机器,这有点矫枉过正。
我一直在研究OnFailure并编写了一个迷你服务,在它被触发时发送警报电子邮件,但 OnFailure 每次服务终止时都会触发,而不是在达到开始限制时触发,所以我们收到了一堆电子邮件而不是一个。
下一步尝试什么的任何想法?
/var/log/journal不小心删除了我的后,我无法从后果中恢复过来。systemd-journald每次我尝试启动它时都会一遍又一遍地失败。当我运行时:
$ journalctl --verify
PASS: /run/log/journal/system.journal
Run Code Online (Sandbox Code Playgroud)
这并没有让我更接近解决它,因为它/run/log/journal/system.journal是在我/usr/lib/systemd/systemd-journald直接运行时创建的,它自己输出
$ /usr/lib/systemd/systemd-journald
Failed to open runtime journal: Invalid argument
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的事情:
/var/log/journal and/run/log/journal`。/var/log/journal从另一台机器复制到两条路径,运行journalctl --verify检查它们,并再次使用--file标志。/etc/systemd/journald.conf为Storage=volatile只是禁用/var/log/journald.我有一台运行 CoreOS 的服务器,我通过 DHCP 配置的主网络接口获得了一个运营商并且可以路由,但永远不会离开configuring状态。这会导致systemd-networkd-wait-online.service失败。查看 的日志文件systemd-networkd.service,我看到接口从何处获取载体,但没有看到任何错误消息可以帮助我弄清楚为什么它卡在configuring状态中。关于如何调试这个的任何建议?
下面是一些相关的细节:
core@server ~ $ networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier configured
2 enp0s25 ether routable configuring
3 docker0 ether no-carrier configured
3 links listed.
core@server ~ $ networkctl status enp0s25
? 2: enp0s25
Link File: /usr/lib64/systemd/network/99-default.link
Network File: /usr/lib64/systemd/network/zz-default.network
Type: ether
State: routable (configuring)
Path: pci-0000:00:19.0
Driver: e1000e
Vendor: Intel Corporation
Model: Ethernet Connection (3) I218-V
HW Address: b8:ae:ed:76:f9:cd (Elitegroup Computer Systems …Run Code Online (Sandbox Code Playgroud) 我想限制每个用户对系统的使用。由于 Systemd 对 cgroups 有本机支持,我认为使用用户切片是可行的方法。
问题是:我不知道如何设置个人限制。我可以编辑 user.slice 单元文件以设置共同适用于所有用户切片的限制,但我没有看到对这些用户切片进行模板化的方法。
我可以通过创建一个 user-(uid).slice 单元文件来覆盖单个用户的这些设置,但我更愿意默认对所有用户应用限制。
是否可以设置默认限制?
编辑:经过一番探索后,我发现用户切片的单元文件是在 /run/systemd/system/ 中创建的。
[foo@bar Downloads]$ systemctl cat user-1000.slice
# /run/systemd/system/user-1000.slice
# Transient stub
# /run/systemd/system/user-1000.slice.d/50-After-systemd-logind\x2eservice.conf
[Unit]
After=systemd-logind.service
# /run/systemd/system/user-1000.slice.d/50-After-systemd-user-sessions\x2eservice.conf
[Unit]
After=systemd-user-sessions.service
# /run/systemd/system/user-1000.slice.d/50-Description.conf
[Unit]
Description=User Slice of foo
# /run/systemd/system/user-1000.slice.d/50-TasksMax.conf
[Slice]
TasksMax=infinity
Run Code Online (Sandbox Code Playgroud)
这些文件由 systemd 中的这段代码构建:https : //github.com/systemd/systemd/blob/401e33ed56f3cd3736bbab02ca6eb31aa592cf53/src/login/logind-dbus.c#L2928-L2998
这个文件的创建似乎被硬编码到 systemd 源代码中,并且不允许使用模板。
systemd ×10
linux ×3
apache-2.4 ×1
centos7 ×1
cgroup ×1
escaping ×1
fedora ×1
journalctl ×1
journald ×1
networking ×1
service ×1