我编写了一个简单的 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) 我已经设置了 WSL 2 (Ubuntu) 并在那里安装了 systemd (和 systemd-sysv)。之后,我跑了:
\n\nsudo mkdir -p /run/dbus\nsudo dbus-daemon --system\nsudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target\nRun Code Online (Sandbox Code Playgroud)\n\n安装之前systemd,我将ubuntu更新到18.10(使用sudo do-release-upgrade多次)
它工作了一段时间,但现在,它只能以普通用户身份工作。\n作为 root,我得到了
\n\nFailed to list units: Connection reset by peer\nRun Code Online (Sandbox Code Playgroud)\n\n在任何systemctl命令上。
因此,我可以查看服务的状态,但无法启用/禁用 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在主机上执行并运行:
sudo …Run Code Online (Sandbox Code Playgroud) 我正在将 Upstart 配置文件转换为 systemd 单元文件。我们使用许多环境变量来存储使用 EnvironmentFile 指令导入的魔法变量
导出 EC2_URL="https://ec2.us-west-1.amazonaws.com"
我凭经验发现 systemd 不喜欢这样,删除 export 命令会减少它的不快。但是我无法在 systemd 文档或其他地方(Web)中找到说明环境变量文件中允许使用哪种语法的地方。systemd 是否隐式使用导出?
这里是 Unix 新手。我正在尝试从gunicorn开始systemctl。没有出现错误消息,但它也没有显示在进程列表中:
$ 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\nRun Code Online (Sandbox Code Playgroud)\n\n有没有可能它正在运行,但不可见?
\n\n或者如果没有,我该如何调试它没有运行的原因?
\n\n更新:刚刚尝试systemctl status gunicorn并得到了这个:
\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 脚本 /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 foo或service start foo.service
start: unrecognized service
Run Code Online (Sandbox Code Playgroud)
怎么了?Ubuntu 16.04
我有一个 RPi3。由于它没有硬件时钟,我有一个服务可以tlsdate与本地服务器同步时间。(这是在每次启动时触发。由于频繁断电而定期触发)。
我还有一个计时器mysync.timer启动mysync.service的同步操作我的日历。这会使用OAuth,如果时间不匹配,则会出错。
有没有办法启动tlsdate.servicebefore mysync.service,每次mysync.service运行?
我查看了 systemd 文档并找到了Before=and After=,但我不确定如何将它与计时器一起使用。
我明白为什么 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 会话吗?
我安装了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 机器复制过来的日志文件列表。如何在 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) 我将如何在 ArchLinux 中使用Systemdlike rc.localin在启动时运行命令Sysv?
我正在尝试编写一个脚本来将笔记本电脑上的文件夹同步到我的 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: …
我为 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) 我想在 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)中不可用。