标签: systemd

启动另一个 systemd 服务时停止另一个 systemd 服务

我编写了一个简单的 zram.service 文件,它将为我设置压缩交换空间,以避免过多占用我的磁盘。zram 比其他交换设备具有更高的优先级。

问题是,当我尝试休眠系统时,它会将系统状态写入交换,在本例中是 zram,并且由于断电时内存内容会丢失,这当然不起作用。

解决方案是在执行systemctl hibernate之前停止我的zram.service,并在系统备份时再次启动它。

据我发现 systemctl hibernate 启动 /lib/systemd/system/systemd-hibernate.service 。我已将此服务复制到 /etc/systemd/system/ 来覆盖它,并且我可能可以通过使用 'ExecStartPost=' 节来使其工作,但我认为当另一个 systemd 服务启动时,必须有更好的方法来停止它开始,反之亦然。

编辑:对于那些感兴趣的人来说,Debian 系统上的工作 zram 服务

[Unit]
Description=ZRAM swap
Conflicts=hibernate.service

[Service]
Environment=ZRAM_MEM=1G
Environment=ZRAM_CMPALGO=lz4
Environment=ZRAM_CMPSTREAMS=2


Type=oneshot
User=root
ExecStartPre=/bin/sh -c "/sbin/modprobe zram num_devices=1"
ExecStartPre=/bin/sh -c "echo $ZRAM_CMPALGO >/sys/block/zram0/comp_algorithm"
ExecStartPre=/bin/sh -c "echo $ZRAM_CMPSTREAMS >/sys/block/zram0/max_comp_streams"
ExecStartPre=/bin/sh -c "echo $ZRAM_MEM > /sys/block/zram0/disksize"
ExecStartPre=/bin/sh -c "/sbin/mkswap /dev/zram0"
ExecStart=/sbin/swapon /dev/zram0 -p 10

ExecStop=/sbin/swapoff /dev/zram0
ExecStop=/bin/echo 1 > /sys/block/zram0/reset
ExecStop=/sbin/rmmod zram

RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

debian hibernate systemd

3
推荐指数
1
解决办法
4743
查看次数

连接被对等方以 root 身份在 systemctl 上重置

我已经设置了 WSL 2 (Ubuntu) 并在那里安装了 systemd (和 systemd-sysv)。之后,我跑了:

\n\n
sudo mkdir -p /run/dbus\nsudo dbus-daemon --system\nsudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

安装之前systemd,我将ubuntu更新到18.10(使用sudo do-release-upgrade多次)

\n\n

它工作了一段时间,但现在,它只能以普通用户身份工作。\n作为 root,我得到了

\n\n
Failed to list units: Connection reset by peer\n
Run Code Online (Sandbox Code Playgroud)\n\n

在任何systemctl命令上。

\n\n

因此,我可以查看服务的状态,但无法启用/禁用 dis 服务的启动或启动/停止它们。

\n\n

我还可以在全新安装中复制它:

\n\n

我从 Microsoft Store 安装了 Debian (WSL2)

\n\n

我执行了以下命令:\n sudo apt-get update -y\n sudo apt-get install -y dbus-x11\n sudo apt-get install daemonize

\n\n

然后,我wsl --shutdown在主机上执行并运行:

\n\n
sudo …
Run Code Online (Sandbox Code Playgroud)

dbus systemd windows-10 windows-subsystem-for-linux

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

在 EnvironmentFile 中使用导出

我正在将 Upstart 配置文件转换为 systemd 单元文件。我们使用许多环境变量来存储使用 EnvironmentFile 指令导入的魔法变量

导出 EC2_URL="https://ec2.us-west-1.amazonaws.com"

我凭经验发现 systemd 不喜欢这样,删除 export 命令会减少它的不快。但是我无法在 systemd 文档或其他地方(Web)中找到说明环境变量文件中允许使用哪种语法的地方。systemd 是否隐式使用导出?

environment-variables systemd

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

使用 systemctl 启动的进程没有抛出任何错误,但没有出现在进程列表中?

这里是 Unix 新手。我正在尝试从gunicorn开始systemctl。没有出现错误消息,但它也没有显示在进程列表中:

\n\n
$ sudo systemctl start gunicorn\n$ ps aux | grep gunicorn\ntest+ 29902  0.0  0.0  14224   924 pts/0    S+   11:13   0:00 grep --color=auto gunicorn\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有可能它正在运行,但不可见?

\n\n

或者如果没有,我该如何调试它没有运行的原因?

\n\n

更新:刚刚尝试systemctl status gunicorn并得到了这个:

\n\n
\xe2\x97\x8f gunicorn.service - Gunicorn Application Server handling myapp\n   Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)\n   Active: inactive (dead) (Result: exit-code) since Mon 2016-10-31 11:24:04 EDT; 1min 25s ago\n  Process: 30135 ExecStart=/.venv/bin/gunicorn --workers 3 --bind unix:/home/myapp/myapp/myapp.sock myapp.wsgi:application (code=exited, status=200/CHDIR)\n Main …
Run Code Online (Sandbox Code Playgroud)

systemd systemctl

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

我的新 systemd 脚本的“无法识别的服务”

我创建了一个新的 systemd 脚本 /etc/systemd/system/foo.service

[Unit]
Description="My foo script"
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/foo
Run Code Online (Sandbox Code Playgroud)

当我跑步service start fooservice start foo.service

start: unrecognized service
Run Code Online (Sandbox Code Playgroud)

怎么了?Ubuntu 16.04

ubuntu systemd

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

在定时器单元启动之前触发另一个系统单元启动?

我有一个 RPi3。由于它没有硬件时钟,我有一个服务可以tlsdate与本地服务器同步时间。(这是在每次启动时触发。由于频繁断电而定期触发)。

我还有一个计时器mysync.timer启动mysync.service的同步操作我的日历。这会使用OAuth,如果时间不匹配,则会出错。

有没有办法启动tlsdate.servicebefore mysync.service,每次mysync.service运行?

我查看了 systemd 文档并找到了Before=and After=,但我不确定如何将它与计时器一起使用。

linux time systemd

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

如何防止 systemd 杀死我的 tmux 会话?

我明白为什么 systemd 在我登出时想要杀死我的东西。我想为 tmux 做个例外。这是我到目前为止所得到的:

/etc/logind.conf

[Login]
KillUserProcesses=no 
Run Code Online (Sandbox Code Playgroud)

.xinitrc

loginctl enable-linger $USER
Run Code Online (Sandbox Code Playgroud)

还有别名...

$ alias tmux
tmux='systemd-run --scope --user tmux'
Run Code Online (Sandbox Code Playgroud)

各种谷歌搜索告诉我,每一个都应该独立工作。从来没有。我可以使用其他一些设置来保留我的 tmux 会话吗?

arch-linux tmux systemd

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

在 Centos 7 上使用 systemd 启动 Tomcat 8.5

我安装了Tomcat 8.5,我可以手动成功启动它,例如:

su tomcat startup.sh
Run Code Online (Sandbox Code Playgroud)

工作正常,tomcat 能够在端口 8080 上提供服务。

我需要自动启动,所以我创建了文件/etc/systemd/system/tomcat-prod.service:

[Unit]
Description=Tomcat 8.5 servlet container - Production
After=network.target

[Service]
Type=forking

ExecStart=/opt/appservers/production/apache-tomcat-8.5.37/bin/startup.sh
ExecStop=/opt/appservers/production/apache-tomcat-8.5.37/bin/shutdown.sh

User=tomcat
Group=tomcat   

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

该文件是故意裸露的,我所有的环境变量都在 setenv.sh 中。我尝试使用以下方法运行它:

# systemctl daemon-reload
# systemctl start tomcat-prod
Run Code Online (Sandbox Code Playgroud)

由于上述原因,Tomcat 在启动后立即退出。我在任何地方都没有得到任何解释原因的日志。Tomcat 在启动时创建一个空的 catalina.out 文件,并且 systemctl status tomcat-prod 仅提供以下内容:

tomcat-prod.service - Tomcat 8.5 servlet 容器 - 生产加载:已加载(/etc/systemd/system/tomcat-prod.service;启用;供应商预设:禁用)活动:自 2019 年星期五以来失败(结果:退出代码)- 01-04 08:08:27 UTC;3s前进程:3583 ExecStop=/opt/appservers/production/apache-tomcat-8.5.37/shutdown.sh (code=exited, status=203/EXEC) 进程:3569 ExecStart=/opt/appservers/production/apache- tomcat-8.5.37/bin/startup.sh (code=exited, status=0/SUCCESS) Main PID: 3581 (code=exited, status=0/SUCCESS)

Jan 04 08:08:27 *.net startup.sh[3569]:启动期间发现现有 PID 文件。Jan 04 08:08:27 …

linux tomcat systemd centos-7

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

如何在 Mac 上打开 systemd 日志文件

我有一个从 Linux 机器复制过来的日志文件列表。如何在 Mac 上阅读这些内容?

system.journal
system@00057f81c3557a96-72d9555724020539.journal~
system@00057f81c3578ad2-0b1342e26a1084c2.journal~
system@00057f81c35da2ae-1e08ad8d9fb4490e.journal~
system@00057f81c36061ae-4887cabc406c0730.journal~
system@00057f81c3610f02-a2ef88fdd0f7b8b8.journal~
system@00057f81c361f8c9-291d730f905c8c13.journal~
system@00057f81c3622e0e-e11a80ce27e19d78.journal~
system@000581375327165b-1ebd65852c52012b.journal~
system@000581414f1d5717-3fb84669d371cc85.journal~
system@000581414f1eb991-d03234bfd7e97526.journal~
Run Code Online (Sandbox Code Playgroud)

linux mac systemd docker

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

在启动时运行命令

我将如何在 ArchLinux 中使用Systemdlike rc.localin在启动时运行命令Sysv

arch-linux systemd sysvinit

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

从 systemd 调用时 ssh 不起作用

我正在尝试编写一个脚本来将笔记本电脑上的文件夹同步到我的 NAS。从命令行调用时,脚本运行良好。我已经尝试将脚本设置为使用 systemd 自动运行。但是ssh登录有问题。虽然从命令行运行脚本时它工作正常,但我收到了权限被拒绝的错误。

到目前为止,这是我尝试缩小问题范围的方法:

脚本/home/tikey/scripts/nas_sync_photos_to_nas.sh

#!/bin/bash
set -x
ssh tikey@192.168.17.200 -v -i /home/tikey/.ssh/id_rsa ls -la rsync_laptop
Run Code Online (Sandbox Code Playgroud)

要使用 systemd 运行脚本,我已将文件sync-photos-to-nas.service放入~/.config/systemd/user/

[单元]
说明=同步图片到 nas
[服务]
ExecStart=/home/tikey/scripts/nas_sync_photos_to_nas.sh

从命令行运行脚本工作正常。不幸的是,使用 systemd 运行脚本不起作用。我已经运行了 systemd 服务systemctl --user start sync-photos-to-nas.service。然后,使用journalctl --user-unit sync-photos-to-nas,我得到:

...
debug1:主机 '192.168.17.200' 已知并且与 RSA 主机密钥匹配。
debug1:在 /home/tikey/.ssh/known_hosts:2 中找到密钥
debug1:在 4294967296 个块后重新加密
debug1: SSH2_MSG_NEWKEYS 发送
debug1:期待 SSH2_MSG_NEWKEYS
debug1:在 4294967296 个块后重新加密
debug1:收到 SSH2_MSG_NEWKEYS
debug1:收到 SSH2_MSG_SERVICE_ACCEPT
debug1:可以继续的身份验证:publickey、password、keyboard-interactive
debug1:下一个身份验证方法:publickey
debug1:提供 RSA 公钥:/home/tikey/.ssh/id_rsa
debug1:服务器接受密钥:pkalg ssh-rsa blen 535
debug1: read_passphrase: …

linux ssh systemd

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

LetsEncrypt/certbot Systemd 计时器/服务在 Ubuntu 18.04 上不起作用

我为 nginx 安装了 certbot,并且自动更新脚本自动设置,但这是我在运行时收到的电子邮件:

/home/foobar/certbot-renew.sh: 1: /home/foobar/certbot-renew.sh: /usr/bin/certbot: not found

certbot-renew.sh让我困惑的是,我的主目录中没有......?

更多信息来自systemctl

# /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

# /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true
Run Code Online (Sandbox Code Playgroud)

我是 systemd 的新手,非常感谢您的帮助!

编辑:

正如 @grawity 建议的那样,我检查了我的 crontabs 并发现了这个:

foo@bar:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu systemd letsencrypt certbot

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

覆盖 systemd drop-in 中的 ExecStartPre=

我想在 Debian (Buster) 下添加一个 systemd 插件nginx.service。包含的ExecStartPre=指令应在服务器启动之前从模板创建 Nginx 配置文件。

我面临的麻烦是/lib/systemd/system/nginx.service已经包含一个ExecStartPre=,它检查 Nginx 配置文件的有效性。由于它是在ExecStartPre=我的 drop-in 之前执行的,并且 Nginx 配置文件此时尚未完成,因此systemctl start nginx.service失败。

我如何指示 systemd 执行我的ExecStartPre=第一个(或忘记ExecStartPre=from /lib/systemd/system/nginx.service)?

UPDATE ExecCondition=看起来很有希望,但显然在我的 systemd 版本(241)中不可用。

debian nginx systemd

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