我编写了三个服务单元,例如a.service、b.service 和c.service。C需要并在b之后运行,b需要并在a之后运行,所以当我执行“systemctl start c.service”时,它们三个都会一一启动。但是当我想停止所有这些服务时,我必须执行“systemctl stop a.service b.service c.service”。有没有其他方法可以用更少的打字来阻止所有这些?
我知道使用“Bindto=”我可以使用“systemctl stop a.service”来停止所有这些服务,但是如果我得到 c Bindto a 和 b,而 a 和 b 彼此之间没有必需的关系怎么办?
我想弄清楚是否启用了服务。
使用 SysV Init 很容易。但是 withsystemctl status <service name>令人困惑,而且 systemd 太复杂而无法深入研究。
具体来说,我尝试启用
# systemctl enable watchdog.service
Run Code Online (Sandbox Code Playgroud)
但重启后它给了我这个状态:
# systemctl status watchdog.service
? watchdog.service - watchdog daemon
Loaded: loaded (/lib/systemd/system/watchdog.service; static; vendor preset: enabled)
Active: inactive (dead)
Run Code Online (Sandbox Code Playgroud)
但我无法理解 id 它已启用但发生了一些事情,或者如果启用服务命令失败。
在任何时候,手动启动服务都可以正常工作:
# systemctl start watchdog.service
# systemctl status watchdog.service
? watchdog.service - watchdog daemon
Loaded: loaded (/lib/systemd/system/watchdog.service; static; vendor preset: enabled)
Active: active (running) since Qua 2016-12-21 04:03:26 BRST; 2s ago
Process: 9111 ExecStart=/bin/sh -c [ $run_watchdog != 1 …Run Code Online (Sandbox Code Playgroud) 大约在系统启动时运行使用Python脚本出现StackOverflow的答案{{,并}}在它的语法。他们的意思是什么?
ExecStart={{ venv_home }}/bin/fooservice --serve-in-foreground
我也不清楚venv_home从哪里来。我找不到它作为任何预定义变量,我无法想象 systemd 对 python 虚拟环境有任何了解。
这是我难以理解的答案:https : //stackoverflow.com/a/37211676/2297550
我有一个需要运行多个进程的网站(python、node 等)。我目前创建了一个 systemd 服务,因此我可以轻松启动和停止这些进程。我创建了一个启动脚本,它启动我需要的所有进程作为后台进程(附加&到命令的末尾)。
这使我无法在崩溃时使用 systemd 的自动重启功能,因为所有进程都在单个脚本下启动。
我能想到的一个潜在解决方案是为每个进程创建一个服务,然后通过创建一个主服务将Requires它们链接在一起。我不喜欢这个,因为这意味着我需要为我想要运行的这个网站的每个环境创建 4-5 个服务。
有没有一种方法可以轻松定义启动多个进程并分别监视每个进程的服务?
我的问题是如何配置 systemd(?) 以在我忘记键入 sudo 时停止打开这个烦人的弹出窗口。只需给我一个基于文本的 sudo 提示或显示错误,我就可以快速纠正错误。
这是 Arch Linux,最新版本(systemd 238.133)。
简单的任务。我有一个在系统上全局安装的用户服务(即在像 的路径中/usr/lib/systemd/user)。我现在想为系统上的所有用户启用此服务(即默认启用它。我不在乎用户是否可以再次为自己禁用它)。我知道我可以通过用户身份启用该服务systemctl --user enable my.service- 但这显然只会为当前用户激活该服务。
不确定是否相关,但这是相应单元文件的外观。我测试了它并且它有效:
[Unit]
Description=My App
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/myapp --systemd-log
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud) 在关闭机器时,我需要在机器上的一组其他服务停止之前运行脚本。(就我而言,终止 EC2 实例。)
我已经尝试了这个问题的答案的变体,但没有任何效果:如何在使用 systemd 关闭时在其他所有内容之前运行脚本?(我也看了 unix.se,但它也不好:https ://unix.stackexchange.com/questions/39226/how-to-run-a-script-with-systemd-right-before-shutdown .. . 我也查看了邮件列表。)
我最大的问题是该问题的 OP 想在卸载某些挂载之前运行脚本,但我对挂载没有任何要求,而是对服务有任何要求。
我的服务是这样的:
[Unit]
Description=Run script before other things stop on shutdown
Wants=multi-user.target network.target foo.service bar.service
After=multi-user.target network.target foo.service bar.service
[Service]
ExecStart=/bin/true
ExecStop=-/my/script
ExecStopPost=/bin/sleep 5s
RemainAfterExit=yes
Type=oneshot
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我在启动后启用并启动了这个单元,但是当我关闭实例时它似乎没有运行脚本。我不知所措,我该怎么办?
我在 Debian Stretch 上使用 systemd 232。
我正在尝试在单元文件中设置一个日期以进行记录
我的单元文件如下所示:
[Unit]
Description=Jetty service
After=multiuser.target
[Service]
Environment=MAIN_CLASS="com.candorgrc.nphase.MainJetty"
Type=simple
User=jetty
Group=jetty
WorkingDirectory=/home/jetty/dist
PermissionsStartOnly=true
ExecStartPre=/bin/systemctl set-environment date=$(/bin/date +%%Y-%%m-%%d-%%H-%%M)
ExecStart=/usr/bin/java -Xms512m -Xmx1024m -Djava.util.logging.config.file=/home/jetty/logging.properties -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_${date} -verbose:gc -Dcom.sun.management.jmxremote.port=12321 -Dcom.sun.management.jmxremote.authen
PIDFile=/var/run/jetty.pid
ExecReload=/bin/kill -HUP $MAINPID
#Restart=on-failure
ExecStop=/bin/kill -9 $MAINPID
Run Code Online (Sandbox Code Playgroud)
设置日期并不能正常工作。我得到的错误如下:
Nov 26 16:47:50 vps203756 systemctl[14275]: Failed to set environment: Invalid environment assignments
Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Control process exited, code=exited status=1
Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Failed with result 'exit-code'.
Nov 26 16:47:50 vps203756 systemd[1]: Failed to start Jetty service.
Run Code Online (Sandbox Code Playgroud)
知道如何配置它才能工作吗?
[Unit]
Description=test
Before=shutdown.target
[Service]
ExecStart=/bin/true
ExecStop=/usr/local/bin/test.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我尝试了很多例子,但没有奏效。上面的例子适用于重启和关机。我只想在关机时工作。
我没有服务器。这是我的个人电脑。我有 Gnu/linux 操作系统。是否可以仅在关机时运行脚本而不重新启动?
我遇到了一个问题,我有一堆 systemd 计时器设置为按计划运行以执行各种与备份相关的任务。他们在指定的时间成功运行。但是,它们也会在系统启动时运行,我想避免这种情况。例如,我有一个需要几个小时才能完成的远程 rsync,它只需要在晚上运行一次,而不是在重新启动时运行。
这是一个示例计时器:
[Unit]
Description=Run Remote rsync
Requires=remote-backup.service
[Timer]
OnCalendar=*-*-* 4:00:00
RandomizedDelaySec=1h
Persistent=false
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
这是它运行的服务:
[Unit]
Description=Remote backup
After=zfs.target network-online.target
OnFailure=status-email-root@%n.service
[Service]
Type=oneshot
ExecStartPre=/path/to/pre-backup script
ExecStart=/path/to/backup-script
ExecStartPost=/path/to/post-backup script
Run Code Online (Sandbox Code Playgroud)
(备份前和备份后脚本会 ping 运行状况检查 URL,以便我获得成功/失败/等报告。)
问题是它应该只在凌晨 4 点运行,但如果我重新启动它会尝试在启动时运行。我试过改成Persistentfalse 没有效果。我想保持它的真实性,因为如果备份真的失败或没有运行,我想重新运行它,但不是每次都运行它!
我也尝试删除WantedBy但这只是让事情永远不会运行,我也尝试更改Type服务但没有成功。
如果有人有任何见解,我将不胜感激。谢谢!