我有一个处理用户输入的 Web 应用程序,作为其中的一部分,运行一些命令来systemd-run --user --scope ...
限制内存和 CPU 使用率。
该应用程序在正常运行时运行良好,但是当作为 systemd 服务运行时,我得到:
Failed to connect to bus: No medium found
我需要在单位中做什么才能使该服务启用此功能?
我有一个处理用户输入的 Web 应用程序,作为其中的一部分,运行一些命令来systemd-run --user --scope ...
限制内存和 CPU 使用率。
该应用程序在正常运行时运行良好,但是当作为 systemd 服务运行时,我得到:
Failed to connect to bus: No medium found
我需要在单位中做什么才能使该服务启用此功能?
正如常见的那样,lxd
提供了两个 systemd 单元:lxd.socket
和lxd.service
。lxd.socket
启动时,lxd.service
只要任何应用程序(例如lxc
)尝试访问 lxd 守护程序,它就会启动。
我想lxd
在启动时启动,而无需运行任何命令。但是,当我尝试启用 时lxd.service
,它会启用lxd.socket
:
# systemctl enable lxd.service
Created symlink /etc/systemd/system/sockets.target.wants/lxd.socket → /usr/lib/systemd/system/lxd.socket.
这里发生了什么?我怎样才能启用lxd.service
?
系统运行的是 Fedora 39。这些是单元文件:
/usr/lib/systemd/system/lxd.service
:
[Unit]
Description=LXD - main daemon
After=network-online.target openvswitch-switch.service lxcfs.service lxd.socket
Requires=network-online.target lxcfs.service lxd.socket
Documentation=man:lxd(1)
[Service]
Environment=LXD_DOCUMENTATION=/usr/share/doc/lxd-doc/html
Environment=LXD_OVMF_PATH=/usr/share/edk2/ovmf
Environment=LXD_UI=/usr/share/lxd-ui/ui
ExecStart=/usr/bin/lxd --group lxd
ExecStartPost=/usr/bin/lxd waitready --timeout=600
KillMode=process
TimeoutStartSec=600s
TimeoutStopSec=30s
Restart=on-failure
LimitNOFILE=1048576
LimitNPROC=infinity
TasksMax=infinity
[Install]
Also=lxd-containers.service lxd.socket
/usr/lib/systemd/system/lxd.socket
:
[Unit]
Description=LXD - unix socket
Documentation=man:lxd(1)
[Socket]
ListenStream=/var/lib/lxd/unix.socket
SocketGroup=lxd
SocketMode=0660
Service=lxd.service
[Install]
WantedBy=sockets.target
我有一个快速虚拟机,但 systemd 服务systemd-zserdbd.service
失败并显示
Dec 01 17:45:32 server-new systemd[1]: Starting systemd-remount-fs.service...
...
Dec 01 17:45:32 server-new (-userdbd)[183]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[185]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new systemd[1]: Started systemd-journald.service.
Dec 01 17:45:32 server-new (-userdbd)[186]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[187]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
Dec 01 17:45:32 server-new (-userdbd)[188]: systemd-userdbd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-userdbd: Read-only file system
...
Dec 01 17:45:32 server-new systemd-fsck[180]: /usr/bin/fsck.xfs: XFS file system.
Dec 01 17:45:32 server-new systemd[1]: Finished systemd-remount-fs.service.
...
Dec 01 17:45:32 server-new systemd[1]: Reached target local-fs-pre.target.
...
Dec 01 17:45:33 server-new systemd[1]: Reached target local-fs.target.
该错误非常明显:systemd-userdbd.service
需要可写的根文件系统,但在文件系统重新挂载为可写之前启动。
systemctl edit systemd-userdbd.service --drop-in=wait-for-rw-root
因此,我想通过with添加必要的依赖项
[Unit]
Wants=local-fs.target
After=systemd-userdbd.socket systemd-remount-fs.service local-fs.target
但这似乎在启动时创建了循环依赖。重新挂载文件系统需要很长时间,直到 systemd 超时。
systemd-userdbd.service
在根文件系统变得可写后启动而不创建循环依赖?当使用 systemd/networkctl 启动特定网络接口时,即每次进入“可路由”状态时,我需要运行脚本。
当接口启动或关闭时,设备保持“活动”状态,即我不能依赖“sys-subsystem-net-devices-$DEVICE.device”单元。
我尝试创建一个路径单元来观看“/sys/class/net/$DEVICE/operstate”,但这似乎不适用于 sysfs 文件系统。
还有其他方法可以做到这一点吗?
在我的日记日志中,我看到如下条目:
systemd[865]: app-org.kde.konsole-fbe1036742844b1ea3cd54e064c0a794.scope: Killing process 14893
显然 konsole 确实为每个实例启动一个作用域(并且存在每个选项卡添加一个作用域的错误),但是打开了几个konsole
s,我得到:
$ systemctl list-unit-files --all | grep konsole
$ systemctl list-units --all | grep konsole
$ systemctl list-units --type scope
init.scope
session-1.scope
标题几乎描述了一切。启动容器后,唯一正在运行的进程/sbin/init
是systemd
. 没有系统日志,空的journalctl,lxc-start
附加的控制台什么也没有提供,没有D-BUS - 所以所有systemd控制命令都会失败。
在这种情况下有什么解决办法吗?
这真的很烦人,systemd
只回应我的服务文件配置错误,但没有具体指出错误在哪里:
/lib/systemd/system/auto_pgha.service
:
[Unit]
Description=PostgreSQL High Availability
After=network.service
After=firewalld.service
[Service]
Type=simple
WorkingDirectory=/etc/repmgr
ExecStartPre=/bin/bash -c 'echo -e "\n" `date +"%Y/%m/%d %a, %X"`": STARTING \n" >> pgha.log'
ExecStart=/bin/bash -c "python3 pg_high_availability.py &>> pgha.log"
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
在目录内/etc/repmgr
这两个命令运行得很好。但 systemd 服务只是响应了一个错误:
# systemctl start auto_pgha
Failed to start auto_pgha.service: Unit auto_pgha.service has a bad unit file setting.
See system logs and 'systemctl status auto_pgha.service' for details.
# systemctl status -l auto_pgha
○ auto_pgha.service - PostgreSQL High Availability
Loaded: bad-setting (Reason: Unit auto_pgha.service has a bad unit file setting.)
......
auto_pgha.service: Unit configuration has fatal error, unit will not be be started.
我有许多 podman 容器在一个用户下运行。其中运行的进程有时是资源密集型的(CPU 和内存)。
直到最近我们还没有遇到任何问题。但是,在对容器内运行的程序之一进行不可避免的软件更新之后,容器每天都会同时死亡。我将可用内存增加了一倍,这暂时有所帮助,但问题又回来了。
我在 中发现以下几行/var/log/syslog
,总是在关闭之前出现:
Jul 24 17:01:26 xxx1 systemd[1]: session-5.scope: Deactivated successfully.
Jul 24 17:01:26 xxx1 systemd[1]: session-5.scope: Consumed 9.924s CPU time.
Jul 24 17:01:36 xxx1 systemd[1]: Stopping User Manager for UID 1000...
在此之前不久,CPU 使用率出现峰值,因为容器始终同时执行计划任务。
我没有更改原始版本(Ubuntu 22.04LTS)的任何 systemd 设置。并在中/etc/systemd/system.conf
设置DefaultCPUAccounting
为否。
我怀疑可能存在一些其他限制导致关闭(例如:任务数量),但我在日志中找不到任何有关促使用户管理器停止的信息。
如何查找停止原因?
我想发送一个包含就绪情况和主 pid 的 systemd 通知。不幸的是,systemd 似乎无法处理来自不同名称空间的 pid 转换。(只是猜测...)
具体来说,我正在关注以下服务:
ExecStart=podman run --rm --cgroups=disabled -v /run/systemd:/run/systemd ... script.sh
启动的脚本执行以下操作:
echo "MAINPID=$$" | nc -uUN -w0 /run/systemd/notify
这似乎并没有改变任何事情。MAINPID 设置为 conman(默认)或 podman ( --sdnotify=ignore
)。话又说回来,我实际上是MAINPID=1
从正在运行的容器内部发送的。
这里是否有一些解决方法来确保服务/容器内的特定进程成为 MAINPID?
我想使用systemd运行一个脚本,通过将数据保存到远程存储来进行备份,因此:
这就是我试图做的:
cat /etc/systemd/system/mnt-server-share.mount
[Unit]
Description=Remote storage test
After=network.target
[Mount]
What=server:/share
Where=/mnt/server/share
Type=nfs
Options=defaults,noauto
TimeoutSec=30
[Install]
WantedBy=multi-user.target
cat /etc/systemd/system/backuptest.service
[Unit]
Description=Remote backup test
RequiresMountsFor=/mnt/server/share
[Service]
Type=simple
ExecStart=/usr/local/bin/backup.sh
ExecStop= systemctl stop mnt-server-share.mount
[Install]
WantedBy=multi-user.target
但在脚本结束/失败后,远程存储不再是umount
。我可以将mount
/umount
放入脚本中,但我希望我可以使用systemd来完成...任何人都可以帮助我做到这一点吗?