对于使用 systemd 的最新版本的 debian,不再可以使用 boodlogd 查看 stdout 启动消息
systemd 调试的说明也没有说明如何执行此操作。
那么如何从启动时看到屏幕上准确的 stdout/stderr 日志消息呢?
任务:
\n\n启动时启动 xfce4-clipman
\n\n尝试过:
\n\n我在正确的位置创建了一个具有正确权限的 sh 脚本:
\n\nmartin@martin:/etc/init.d$ ls -l start_clipman.sh \n-rwxrwxr-x 1 root root 26 \xd0\xbc\xd0\xb0\xd1\x80 12 09:05 start_clipman.sh\nRun Code Online (Sandbox Code Playgroud)\n\nsh文件内容:
\n\nmartin@martin:/etc/init.d$ cat start_clipman.sh \n#!/bin/bash\nxfce4-clipman\nmartin@martin:/etc/init.d$ \nRun Code Online (Sandbox Code Playgroud)\n\n我跑了
\n\nmartin@martin:/etc/init.d$ sudo update-rc.d start_clipman.sh \ndefaultsinsserv: warning: script 'K01mount_disk.sh' missing LSB tags and overrides\ninsserv: warning: script 'K01start_clipman.sh' missing LSB tags and overrides\ninsserv: warning: script 'start_clipman.sh' missing LSB tags and overrides\ninsserv: warning: script 'mount_disk.sh' missing LSB tags and overrides\nRun Code Online (Sandbox Code Playgroud)\n\n潜在问题:
\n\n当我这样做时:
\n\nmartin@martin:~$ xfce4-clipman\nRun Code Online (Sandbox Code Playgroud)\n\n … 我正在尝试将运行 Debian 的 IOT 设备连接到 Wifi,在此过程中,我尝试配置 wlan0 接口。我注意到有几种方法可以做到这一点。据我了解(这很可能是错误的):
1)似乎有一种 systemd-networkd 方式,其中涉及修改 /etc/systemd/network/wlan0.network文件,然后理想地systemd-networkd.service在启动时设置接口。
2)有经典的ifupdown配置方式,主要依靠/etc/networking/interfaces文件进行配置。然后,网络服务networking.service在启动时设置这些服务。
我的问题是 1) 我对它们的工作方式是否正确,2) 您是否应该在任何给定时间只启用这些服务之一,以及 3) 一旦一切设置完毕,它们是否都与ip/ifconfig命令ifup兼容ifdown?
基本上,如果有人能给我概述一下这些服务和接口如何交互、什么是遗留的、什么不是等等,我将不胜感激。
谢谢!
所以我有这样的场景:user-a正在运行 systemd 用户服务user-a-service。我是 root,我想重新启动该用户服务。我找不到办法这样做。基本上我想要这个:
systemctl --user user-a restart user-a-service
Run Code Online (Sandbox Code Playgroud)
请注意,这不是使用特定非 root 用户运行的正常系统服务,而是实际的用户服务。
现在我有 systemd 服务文件,其中包含 20 多个环境变量,表示为Environment=这是很多重复,我想删除它们,因为我有celery、Gunicorn和celerybeat的 systemd 文件。
我希望included每个单元文件中都有一个文件,似乎执行此操作的一种方法如下:
\n\n正确的方法是创建一个以单元文件命名的目录,并在末尾附加 .d。因此,对于名为 example.service 的单元,可以创建名为 example.service.d 的子目录。在此目录中,以 .conf 结尾的文件可用于覆盖或扩展 system\xe2\x80\x99s 单元文件的属性。
\n
但这仍然让我陷入与服务名称匹配的文件名称中。我的第一个想法是将所有服务符号链接到同一个文件夹,以便gunicorn.d链接celery.d到celerybeat.d。这样每个服务都会有相同的文件,唯一的额外设置就是创建链接。
那么,我应该在这些目录下使用目录级别的符号链接或文件级别的硬链接来执行此操作吗?
\n或者我的做法完全错误,有一些超级简单的方法来处理这个问题,但我还没有找到。
\n我在我的 Raspberry Pi 上运行 Arch Linux ARM,我需要在启动时启动一个 python(它应该一直运行,直到它崩溃或机器断电)程序,启动后根本没有用户输入。
我对 Arch 有点陌生,所以我真的不知道如何编写服务等等。
我正在使用systemd在启动时启动一个程序并让它在后台运行。
我编写了一个简单的脚本systemd来调用,该脚本将打印几行我希望在终端中看到的日志。
所以我StandardOutput=journal+console在服务配置中进行了设置,但在终端和日志中都看不到输出。
frederick@Frederick-PC:~$ sudo systemctl start my_program.service
frederick@Frederick-PC:~$ journalctl _SYSTEMD_UNIT=my_program.service
No journal files were found.
-- No entries --
Run Code Online (Sandbox Code Playgroud)
这些是我的服务配置和脚本。
/etc/systemd/system/my_program.service
[Unit]
Description=Start my_program client after system is booted
[Service]
Type=forking
ExecStart=/usr/bin/my_program.sh start
ExecStop=/usr/bin/my_program.sh stop
PIDFile=/run/my_program.pid
WorkingDirectory=/home/frederick/Applications/my_program-go/
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
/usr/bin/my_program.sh
#!/bin/sh
start() {
if [ -f /run/my_program.pid ]; then
kill -0 $(cat /run/my_program.pid) > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "my_program has been already started"
exit 1
fi …Run Code Online (Sandbox Code Playgroud) 我想从 shell 脚本编辑 systemd 的单元文件。我想更改单元唯一的ExecStart行。使用systemctl edit对我来说看起来很聪明,但该命令需要一个设置为SYSTEMD_EDITOR环境变量的编辑器。有没有SYSTEMD_EDITOR其他替代方法可以使用echo 'ExecStart=foo' | SYSTEMD_EDITOR=SOMETHING systemctl edit bar?
我发现根据 systemd 的 NEWS 文件,PermissionsStartOnly设置 insystemd已被弃用。
PermissionsStartOnly= 设置已弃用(但仍支持向后兼容)。更灵活的“+”、“!”和“!!”提供了相同的功能 ExecStart= 和其他命令的前缀。
我应该使用+或!或!!,但我不知道如何使用此选项连我都阅读使用说明书。
我myservice.service的如下。我怎么能在没有的情况下重写这个PermissionsStartOnly?
[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/bash -c '/bin/journalctl -b -u ntpdate | /bin/grep -q -e "adjust time server" -e "step time server"'
ExecStartPre=/bin/mkdir -p /path/to/somedir
ExecStart=/path/to/myservice
ExecStop=/bin/kill -INT ${MAINPID}
ExecReload=/bin/kill -INT ${MAINPID} && /path/to/myservice
Restart=always
RestartSec=5
User=myuser
Group=mygroup
Run Code Online (Sandbox Code Playgroud) 我有以下服务配置:
$ systemctl cat bluetooth
# /lib/systemd/system/bluetooth.service
[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth
[Service]
Type=dbus
BusName=org.bluez
ExecStart=/usr/lib/bluetooth/bluetoothd
NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
#RestartSec=5
[Install]
WantedBy=bluetooth.target suspend.target
Alias=dbus-org.bluez.service
Run Code Online (Sandbox Code Playgroud)
我suspend.target在( )部分的WantedBy=参数中添加了要在恢复时重新启动的服务,但这不起作用。[Install]man systemd.unit
EDIT0 :该服务在挂起时不会停止,但需要在恢复后重新启动,因为该服务不支持对我的配置进行挂起/恢复操作。
EDIT1:suspend.target也应该工作,因为根据man systemd.special:
Run Code Online (Sandbox Code Playgroud)suspend.target A special target unit for suspending the system. This pulls in sleep.target.
EDIT2 :似乎该命令sudo systemctl edit --full bluetooth创建了另一个副本,一旦文件被保存bluetooth.service,/etc/systemd/system/bluetooth.service其中就变得不同(从/lib/systemd/system/bluetooth.service)。
我刚刚注意到我有两个不同的版本,bluetooth.service所以我有点困惑。
如何在恢复时重新启动 systemd 服务?
systemd ×10
linux ×6
debian ×2
arch-linux ×1
networking ×1
python ×1
raspberry-pi ×1
shell ×1
shell-script ×1
suspend ×1
xfce4 ×1