标签: systemd

重启Linux中的所有服务而不重启内核?

我有具有加密驱动器的远程计算机,因此每次完全重新启动都需要对计算机进行物理访问。机器刚刚遇到磁盘空间不足的问题,因此部分正在运行的服务崩溃/进入奇怪的故障状态。我想“软重新启动”机器,而不实际重新启动整个内核,以避免重新安装驱动器和输入密码的必要性。

操作系统用于systemd服务管理和内核 4.9。

systemd reboot

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

服务与 shutdown.target 不冲突的影响

< TL;DR >
\n我正在基于当前的 Debian 10 Buster 和内核 ntfsd 调整仅限 NFSv4 的文件服务器;系统 v241。该nfs-kernel-server发行版中的软件包的 systemd 脚本让我觉得有点奇怪。根据 systemd.service(5),一些服务定义文件(包括其nfs-server.service本身)附带设置DefaultDependencies=no,以便该单元不会自动获取依赖项:Conflicts=shutdown.target

\n
\n

[使用DefaultDependencies=yes][s]服务单元将具有类型Conflicts=Before=上的依赖性[...] shutdown.target。这些确保在系统关闭之前正常服务单元被彻底终止。

\n
\n

与我在其他 systemd 自己的软件包中看到的不同,这些都没有明确提供。命令

\n
systemctl show nfs-server.service | egrep '^(Want|Requ|Bind|Bound|Before|After|Confl)'\n
Run Code Online (Sandbox Code Playgroud)\n

证实这实际上是正确的:不存在这样的依赖关系。手册继续,

\n
\n

只有涉及早期启动或延迟系统关闭的服务才应禁用此选项。

\n
\n

NFS 服务器恰恰不是这样,因为在网络完全启动之前它无法开始提供服务,并且一旦系统开始关闭,它就应该停止接受新请求并在负载下停止。

\n

这不是软件包中具有类似设置的单个服务,但这一项是我最担心的。我正在云设置中推出单一用途的虚拟机,文件服务器可能拥有大量的 RAM (64-128G),所有这些都被文件系统缓存塞满了,如 htop(1) 所示。由于这是一台文件存储机器,我无法用言语来表达我多么希望服务器,引用手册, \xe2\x80\x9c 在系统关闭之前干净地终止,\xe2\x80\x9d 特别是鉴于我用导出文件系统的 ext4 挂载选项data=writeback和\xc2\xb9牺牲了一点可靠性来换取性能nobarrier
\n</ TL;DR >

\n

所以我的问题归结为一句话是:

\n

当系统实际上关闭时,不具有Conflicts=和 …

systemd

5
推荐指数
0
解决办法
1164
查看次数

systemd:Requires 与 BindsTo?

我有两个服务在同一台机器上运行,A和B。A是服务器,B是客户端

  • A可以单独运行,但B必须有A运行才可以启动
  • 如果 A 崩溃、停止或重新启动,B 必须停止或重新启动
  • 如果 B 崩溃、停止或重新启动,A 不受影响并可以继续运行

在 B.service 中我应该使用Requires还是BindsTo

[Unit]
Description=service B
After=A.service
Requires=A.service
Run Code Online (Sandbox Code Playgroud)

或者

[Unit]
Description=service B
After=A.service
BindsTo=A.service
Run Code Online (Sandbox Code Playgroud)

我是否需要添加计数器部件,即RequiredByConsistsOf在 A.service 中?

systemd

5
推荐指数
1
解决办法
4802
查看次数

让 systemd 服务稍后停止,而不阻塞“systemctl stop”

我有一堆服务负责运行从队列中消耗的操作。

我希望能够轻轻地重新启动服务(不中断已经在运行的操作)

可以通过处理 systemd 发送的 SIGTERM 并保存程序在处理当前操作后应退出的信息来解决。
还有一个小问题是,TimeoutStopSec在服务配置文件中定义的一段时间后,systemd 将发送额外的 SIGKILL 来残酷地终止我的进程。
我可以通过设置轻松避免它TimeoutStopSec=infinity。然后systemctl stop等到脚本自行终止,这可能会持续一个多小时,并导致我遇到主要问题。

我不希望systemctl命令等到脚本结束

看起来SendSIGKILL=no配置可以完成这项工作。这会导致SIGTERM在之后重试TimeoutStopSec,然后创建新的工作线程,并让旧的工作线程继续运行。

日志控制日志

May 06 14:14:43 jaku systemd[1]: Stopping Jaku test worker...
May 06 14:14:43 jaku python3[31597]: * 15 <frame object at 0x14d8108>
May 06 14:14:53 jaku systemd[1]: jaku-test-worker.service: State 'stop-sigterm' timed out. Skipping SIGKILL.
May 06 14:14:53 jaku python3[31597]: * 15 <frame object at 0x14d8108>
May 06 14:15:03 jaku systemd[1]: jaku-test-worker.service: State …
Run Code Online (Sandbox Code Playgroud)

python signals systemd

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

如果另一个 systemd 服务正在运行,则阻止 systemd 服务启动

在 systemd(UbuntuLinux 18.04 bionic 上的 v237)中,我可以创建一个服务文件(用于A.service),并指定另一个服务Requisite=B.service。这意味着如果我尝试启动A.serviceB.service尚未运行,则 A.service 将不会启动。这是 的弱版本,当我尝试启动时Requires它将启动。B.serviceA.service

\n\n

有相反的吗?我可以说\xe2\x80\x9c如果B.service正在运行,那么就不要启动这个服务\xe2\x80\x9d / \xe2\x80\x9c如果B.service正在运行,那么A.service无法启动\xe2\ x80\x9d?

\n\n

文档说如果我这样做Conflicts=B.service,那么启动A将停止 B 然后启动 A。但我不希望 B 停止,我只是希望 A 无法启动。我想要的东西就是Conflicts这样RequisiteRequires

\n\n

我可能可以将 更改ExecStart为会失败的 shell 命令systemctl is-active B.service或某种 hack。有没有合适的解决办法呢?

\n

job-control systemd systemd-service

5
推荐指数
2
解决办法
9709
查看次数

Systemd 变得无响应

三周内,我的两台 Ubuntu 20.04LTS 服务器systemd突然变得无响应。症状:

  • 所有systemctl用于控制服务或访问日志的命令都会失败并显示错误消息:
Failed to retrieve unit state: Connection timed out
Failed to get properties: Connection timed out
Run Code Online (Sandbox Code Playgroud)
  • systemd不理会logrotate重新打开日志的信号,继续写入重命名的日志文件/var/log/syslog.1,而新创建的日志文件/var/log/syslog仍为空。
  • 许多僵尸进程从 cronjobs 和系统管理任务中积累,即。PID 1 systemd 忽略了其收集孤立进程的职责。
  • 正在运行的服务继续正常运行,但不再可能启动或停止服务,因为即使旧脚本也重定向/etc/init.d到非功能性systemctl.
  • Connection timed out除了尝试与 交互的消息之外,日志中没有任何异常systemd

普遍提出的纠正措施:

  • systemctl daemon-reexec
  • kill -TERM 1
  • 去除/run/systemd/system/session-*.scope.d

不要解决问题。唯一的补救措施是重新启动整个系统,这对于地球另一端的服务器来说当然既具有破坏性又存在问题。

在大约 100 台服务器中,Ubuntu 16.04LTS 大约每月都会出现一次同样的问题。自从升级到 20.04LTS 以来,这种情况已经少了很多,但并没有完全消失。在自 20.04LTS 以来受到攻击的两台服务器中,其中一台在运行 16.04LTS 时就已经受到攻击。

问题:

  • 造成此类systemd故障的可能原因是什么?
  • 我该如何进一步诊断?
  • 有没有比systemd重新启动破坏性更小的方法来从无响应中恢复?

systemd

5
推荐指数
1
解决办法
5649
查看次数

如何使用 Systemd-Networkd 配置接口别名?

我正在尝试将以下别名从 移植/etc/network/interfaces/etc/systemd/network/eth0.network.

auto eth0:1
iface eth0:1 inet static
    address 10.0.2.1/24
Run Code Online (Sandbox Code Playgroud)

networking debian systemd systemd-networkd

5
推荐指数
1
解决办法
4755
查看次数

如何指定日志源自 systemd/journald 的fail2ban 过滤器/监狱?

我已经运行 nginx 并记录到 systemd/journald。

\n

如何指定来自 systemd 单元的日志源?

\n

man jail.conf我看到的后端列出为:

\n
       systemd\n              uses  systemd  python library to access the systemd journal.\n              Specifying logpath is not valid for this backend and instead\n              utilises  journalmatch from the jails associated filter con\xe2\x80\x90\n              fig.\n
Run Code Online (Sandbox Code Playgroud)\n

和:

\n
       journalmatch\n              specifies  the systemd journal match used to filter the journal entries. See journalctl(1) and systemd.journal-fields(7) for matches syntax and\n              more details on special journal fields. This option is only valid for the systemd …
Run Code Online (Sandbox Code Playgroud)

fail2ban systemd journald

5
推荐指数
0
解决办法
5124
查看次数

cgroup fork 被 pids 控制器拒绝

有一个用 C/C++ 编写的小型服务器程序,使用 nginx 和 Postgres,目前都托管在同一个 ubuntu 系统上。我通常从 bash 命令行运行服务器程序。

\n

最近在较新版本的 Ubuntu 上,当服务器程序运行时,大约半分钟后我无法执行任何其他命令;如果屏幕保存,则我无法重新登录。终止我的服务器程序将恢复正常行为。

\n

在 bash 中:按 ENTER 键输入任意命令:

\n
bash: fork: retry: Resource temporarily unavailable\n
Run Code Online (Sandbox Code Playgroud)\n

并将以下内容写入 /var/log/syslog:

\n
Sep  5 09:46:08 ubuntu kernel: [  145.614883] cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/user@1000.service\n
Run Code Online (Sandbox Code Playgroud)\n

系统重新启动后启动服务器程序与系统运行一段时间后启动服务器程序的体验是不同的。具体来说,重新启动后,服务器程序将正常运行。如果服务器程序重新启动,它将以 60% 的利用率运行半分钟,然后跳至 80% 约 5 秒,然后降至 20% 的利用率。看起来好像有什么东西直接限制了应用程序。C组?

\n

PAM 配置: \n在 /etc/pam.d/common-session 中有以下行:

\n
session required    pam_unix.so \nsession optional    pam_systemd.so \n
Run Code Online (Sandbox Code Playgroud)\n

我不认为这有什么区别,但在 /etc/security/limits.d/91-nofile.conf 中我设置了以下 PAM 设置:

\n
*                soft    nofile …
Run Code Online (Sandbox Code Playgroud)

pam cgroup systemd ubuntu-20.04

5
推荐指数
1
解决办法
6073
查看次数

我怎样才能要求journalctl显示除一个单元之外的所有单元的记录?

journalctl -u ssh打印与 ssh 单元关联的所有记录。但是我怎样才能获得与 ssh 单元无关的所有记录呢?不起作用的事情:journalctl -u '!ssh'; journalctl '!_SYSTEMD_UNIT=ssh'; journalctl '_SYSTEMD_UNIT!=ssh'。文档并不表明这是可能的,但我仍然充满希望。;-)

logging systemd journalctl

5
推荐指数
0
解决办法
876
查看次数