标签: systemd

有没有办法将两个实例化的 systemd 服务作为一个单元来控制?

我有几个 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 甚至可以进行这种分组吗?

linux fedora systemd

7
推荐指数
1
解决办法
3276
查看次数

如何在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)

我无法从文件名中删除空格,因为我尝试运行的服务出于某种原因需要它们。

我哪里错了?

service escaping systemd

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

如何对 systemd 服务进行分组/组合?

我有三个 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.serviceb.servicec.service含有PartOf=group.service

systemd

7
推荐指数
1
解决办法
2208
查看次数

在指定的网络命名空间中运行 systemd 单元

我想指示 systemd 在指定的、预先存在的网络命名空间中“运行单元”,特别是在命名空间中启动单元的进程。

linux systemd network-namespace

7
推荐指数
2
解决办法
7873
查看次数

如何按特定顺序停止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]命令,该服务必须在停止之前停止。我遇到的问题是我实际上目前有六个服务使用已安装的分区,并且必须在尝试卸载之前停止。在这六个中,有些需要按特定顺序停止。由于这是用于商业产品,我希望有一个更清洁的解决方案。

linux systemd

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

在 CentOS 7 SystemD 上创建多个 Apache 实例

我正在尝试在 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 apache-2.4 centos7

7
推荐指数
1
解决办法
7961
查看次数

Systemd 在达到启动限制后执行命令

我一直在开发一个 systemd 服务来包装管理脚本,我正在尝试优雅地处理它完全中断。

现在我已经Restart设置为always所以当出现故障时它会再次尝试,但一些故障状态需要注意(缺少配置文件、错误的 SQL 等),所以我不希望它在不可纠正的状态下在后台持续旋转。

我发现StartLimitInterval, StartLimitBurst, 和StartLimitAction在 Y 秒内 X 次失败后停止尝试重新启动它,但事实证明,唯一可用的操作StartLimitAction是重新启动或关闭机器,这有点矫枉过正。

我一直在研究OnFailure编写了一个迷你服务,在它被触发时发送警报电子邮件,但 OnFailure 每次服务终止时都会触发,而不是在达到开始限制时触发,所以我们收到了一堆电子邮件而不是一个。

下一步尝试什么的任何想法?

systemd

7
推荐指数
1
解决办法
8337
查看次数

systemd-journald 根本不启动

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

我已经尝试过的事情:

  1. 清理/var/log/journal and/run/log/journal`。
  2. /var/log/journal从另一台机器复制到两条路径,运行journalctl --verify检查它们,并再次使用--file标志。
  3. 将存储设置更改/etc/systemd/journald.confStorage=volatile只是禁用/var/log/journald.
  4. 重新启动。

systemd journald journalctl

7
推荐指数
1
解决办法
9933
查看次数

DHCP 接口永远不会转换到 systemd 中的配置状态

我有一台运行 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)

networking systemd

7
推荐指数
0
解决办法
1991
查看次数

如何为 systemd 用户切片设置 cgroup 限制?

我想限制每个用户对系统的使用。由于 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 源代码中,并且不允许使用模板。

cgroup systemd

7
推荐指数
1
解决办法
8806
查看次数