我想用来systemd-networkd在 Ubuntu 上配置我的网络。
我添加了一个/etc/systemd/netwoek/host0.network文件
[Match]
Name=host0
[Network]
Address=10.5.1.1/24
Gateway=10.5.1.254
Run Code Online (Sandbox Code Playgroud)
配置我的host0:
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: host0@if14428: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d6:fa:2e:69:dd:30 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 169.254.229.86/16 brd 169.254.255.255 scope link host0
valid_lft …Run Code Online (Sandbox Code Playgroud) Systemd 提供了通过 inotify 控制特定路径监视的单元文件:systemd.path(5). 如果在监视路径中修改了文件或目录,systemd.service(5)则调用相应的。
根据inotify(7)手册页:
为了确定发生了什么事件,应用程序从 inotify 文件描述符中读取 (2)s。如果到目前为止没有事件发生,那么,假设一个阻塞的文件描述符,read(2) 将阻塞直到至少一个事件发生(除非被信号中断,在这种情况下调用失败并显示错误 EINTR;参见信号(7) ))。
每次成功的 read(2) 都会返回一个包含以下一个或多个结构的缓冲区:
Run Code Online (Sandbox Code Playgroud)struct inotify_event { int wd; /* Watch descriptor */ uint32_t mask; /* Mask of events */ uint32_t cookie; /* Unique cookie associating related events (for rename(2)) */ uint32_t len; /* Size of name field */ char name[]; /* Optional null-terminated name */ };
因此,如果 systemd 看到监视路径发生变化,是否有办法从read(2)命令中获取任何数据?值得注意的是我需要的name[]使用作为参数传递给该命令的ExecStart=的systemd.service(5)单元发言。
[Service]
ExecStart=/usr/bin/command --file=$inotifyName
Run Code Online (Sandbox Code Playgroud) 10 次中有 1 次,systemd 在重启期间挂起。我不明白原因。我应该看什么/在哪里解决问题?我正在使用 systemd v196 并且无法将其升级到版本 >=198,因为后者需要最新的内核(支持 cgroups),无法根据客户要求进行更新。我想知道是否有合理的方法可以发现这种行为的原因并让systemd无条件重启系统。
请注意,此链接没有帮助:http : //freedesktop.org/wiki/Software/systemd/Debugging/#index2h1
正如你可以在那里读到的:
关机永不结束
如果正常重启或关机等待几分钟后仍然无法完成,则上述创建关机日志的方法无济于事,必须使用其他方法获取日志。对调试启动问题有用的两个选项也可用于关闭问题:
Run Code Online (Sandbox Code Playgroud)use a serial console use a debug shell - not only is it available from early boot, it also stays active until late shutdown.
我正在使用串行控制台,出于某种原因,我什至可以登录,因为 eth 接口已启动或已启动(在重新启动步骤期间断开连接后)。
我看不出原因。
# cat /etc/systemd/system/
basic.target.wants/ getty.target.wants/ multi-user.target.wants/ sysinit.target.wants/
dbus-org.freedesktop.NetworkManager.service local-fs-pre.target.wants/ sockets.target.wants/ syslog.service
display-manager.service local-fs.target.wants/ swap.target
Run Code Online (Sandbox Code Playgroud)
注意 swap.target 。它在那里,但我们根本不使用交换分区。我试图屏蔽交换,但挂起问题仍然存在。控制台的最后一行是:
[OK] Stopped target shutdown.
Run Code Online (Sandbox Code Playgroud)
编辑:正如我所说,我可以通过 ssh 通过 eth 重新登录。
现在我将向您展示两个日志。第一个日志发生在重启/shutdwon 挂起时,而第二个日志发生在重启成功时:
挂起案例,输出总是这样(完整日志):
[ OK ] Stopped Network Time …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(以 root 身份作为服务运行),它在/var/run. 但我想知道这现在是否不再是最佳实践。
在Linux 中 - 2012 年询问的替代 pid 文件而不是 /var/run 的存储位置,提问者询问是否应该将 PID 文件放入/var/run。不过,这很大程度上是在 systemd 出现之前,以及 systemd 操作系统从/var/run到 just 的转变/run(作为 systemd “ API 文件系统”之一并列在systemd 文件层次结构要求中)。
Lennart Poettering(和其他人)的XDG 基本目录规范之类的东西谈到了“特定于用户的非必要运行时文件和其他文件对象(例如套接字、命名管道……)”的其他地方。systemdfile-hierarchy手册页也是如此。
我在别处读到的内容给我的印象/var/run/user/$UID是systemd 操作系统上此类内容的新标准位置。
--pid-file /run/user/1000/uzbl/event/pid/run/user为了那个原因”。人们可以找到许多其他的例子。
那么我的应用程序应该更改为使用/var/run/user/$UID …
我正在尝试systemd在 Debian 上设置守护进程宽度。
systemd已经是发行版的一部分。刚刚在下面添加了一个新的单元文件 my-daemon.service/etc/systemd/system/但在重新启动后,无论我做什么,我都会收到此错误。它在重新启动之前工作
~ # systemctl daemon-reload
Failed to get D-Bus connection: Unknown error -1
~ # systemctl list-units
Failed to get D-Bus connection: Unknown error -1
Run Code Online (Sandbox Code Playgroud)
也尝试删除单元文件 my-daemon.service 并重新启动系统..但仍然出现相同的错误
# dpkg -l | grep -i dbus
ii at-spi2-core 2.14.0-1 amd64 Assistive Technology Service Provider Interface (dbus core)
ii dbus 1.8.22-0+deb8u1 amd64 simple interprocess messaging system (daemon and utilities)
ii dbus-x11 1.8.20-0+deb8u1 amd64 simple interprocess messaging system (X11 deps)
ii libdbus-1-3:amd64 1.8.20-0+deb8u1 …Run Code Online (Sandbox Code Playgroud) 我们有一个带有多个 IP 地址的服务器。最近我们迁移到 systemd,我们仍然需要该服务器上的多个 IP。使用 systemd-networkd 我们很难找到配置示例。所以我们在启动过程结束时使用 bash 脚本将 ip 添加到接口。
有人可以提供一个 systemd-networkd 配置示例,用于将多个 IP 添加到一个接口。
我尝试启动systemd-timesyncd.service服务但失败了:
root@xxxx:~# systemctl start systemd-timesyncd.service
root@xxxx:~# systemctl status systemd-timesyncd.service
? systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
??disable-with-time-daemon.conf
Active: inactive (dead)
Condition: start condition failed at pi? 2015-07-10 15:17:56 CEST; 1s ago
ConditionFileIsExecutable=!/usr/sbin/ntpd was not met
Docs: man:systemd-timesyncd.service(8)
Run Code Online (Sandbox Code Playgroud)
什么意思:ConditionFileIsExecutable=!/usr/sbin/ntpd was not met?
此消息表明缺乏执行权限,但事实并非如此:
root@xxxx:~# ls -l /usr/sbin/ntpd
-rwxr-xr-x 1 root root 549648 kwi 10 21:04 /usr/sbin/ntpd
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以仅使用一个命令在 systemd 中重新启动服务的所有实例?
假设我们有两个守护进程在运行,分别名为 thingd@01 和 thingd@02。我可以只重启那些而不必为每个实例调用一次 systemctl 吗?
我需要获取机器的 IP 并在我的服务中使用它:
[Unit]
Description=Redmine server
After=syslog.target
After=network.target
[Service]
Type=simple
User=redmine
Group=redmine
ip="$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $ip -p 3000
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
如何在systemd服务文件中执行此命令并获取其结果:
ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)
Run Code Online (Sandbox Code Playgroud)
为了使用它的结果 infor xxx.xxx.xxx.xxx,像这样:
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production …Run Code Online (Sandbox Code Playgroud) 我有以下 systemd 代码。
[Unit]
Description=start RCC logger server process
Requires=rcc-drbd.service rcc_check_locked_scr.service s96rcc.service
After=rcc-drbd.service rcc_check_locked_scr.service s96rcc.service
[Service]
ExecStart= exec /var/RCC/RCClogger.sh
Restart=no
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
在我尝试运行它的地方,出现以下错误。
Mar 23 04:45:52 localhost.localdomain systemd[1]:
[/etc/systemd/system/rcc_logger.service:7] Executable path is not absolute,
ignoring: exec /v...ogger.sh
Mar 23 04:45:52 localhost.localdomain systemd[1]: rcc_logger.service lacks
both ExecStart= and ExecStop= setting. Refusing.
Run Code Online (Sandbox Code Playgroud)
我知道这是因为没有 exec 命令的绝对路径,但是由于 exec 作为二进制文件不可用,我不能使用绝对路径。如何让这个 ExecStart 运行?