我有以下执行脚本的 systemd myscript.service 单元:
[Unit]
Description=MyScript
Wants=time-sync.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/test.sh -a
ExecStop=/usr/local/bin/test.sh -b
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我想使用以下 Systemd myscript.timer 单元每分钟重新启动它:
[Unit]
Description=Schedule script execution
[Timer]
OnCalendar=*:0/1
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
它只在第一次起作用,之后,状态保持为n/a:
# systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
n/a n/a Tue 2019-10-15 14:50:01 EDT 3ms ago myscript.timer myscript.service
Run Code Online (Sandbox Code Playgroud)
〜
我知道systemd
将单元文件存储在不同版本的 Linux 的不同位置。在 RHEL 上,它位于/usr/lib/systemd/system/
,而在基于 Debian 的机器上,它位于/lib/systemd/system/
.
然而,我的Ubuntu 18.04的机器上,我刚刚安装Elasticsearch使用.deb
的文件,它的systemd
单元文件下安装的/usr/lib/systemd/system/
,但systemd
仍然能够把它捡起来。
$ uname -a
Linux nucleolus 4.15.0-46-generic #49-Ubuntu SMP Wed Feb 6 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ sudo systemctl status elasticsearch.service
? elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: http://www.elastic.co
Run Code Online (Sandbox Code Playgroud)
注意路径是/usr/lib/systemd/system/elasticsearch.service
.
那么为什么systemd
单元文件 at/usr/lib/systemd/system/
仍然适用于 Ubuntu?Debian/Ubuntu 系统的真实单元文件加载路径是什么?
我有以下单元文件:
[Unit]
Description=Panel for Systemd Services
After=network.target
[Service]
User=pysd
Group=pysd
PermissionsStartOnly=true
WorkingDirectory=/opt/pysd
ExecStartPre=/bin/mkdir /run/pysd
ExecStartPre=/bin/chown -R pysd:pysd /run/pysd
ExecStart=/usr/local/bin/gunicorn app:app -b 127.0.0.1:8100 --pid /run/pysd/pysd.pid --workers=2
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
ExecStopPost=/bin/rm -rf /run/pysd
PIDFile=/run/pysd/pysd.pid
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Alias=pysd.service
Run Code Online (Sandbox Code Playgroud)
我想创建一个环境变量,ExecStartPre
然后将此变量合并到ExecStart
.
更具体地说,我想GUNICORN_SERVER
在运行 之前创建一个环境变量,ExecStart
然后将此环境变量用于选项-b
at ExecStart
。
我尝试了类似的东西ExecStartPre=/bin/bash -c 'export GUNICORN_SERVER=127.0.0.1:8100'
,但没有创建环境变量。
我如何实现这个场景?
我尝试使用日期输出作为 systemd 单元中日志文件名的一部分。这里的例子:
[Unit]
Description=TCS minetest server unit
[Service]
Type=simple
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$$(date +%%Y_%%m_%%d).txt
ExecReload=/bin/kill -HUP $MAINPID
User=tcs
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
但我得到日志文件:
ls /home/tcs/logs/
'debug_$(date'
Run Code Online (Sandbox Code Playgroud)
如何使用当前日期作为日志文件名?
我一直在阅读 systemd 并对设备单元文件进行了一些探索。
根据手册页:
systemd
将为所有标有“systemd”udev
标签的内核设备动态创建设备单元(默认情况下所有块和网络设备,以及其他一些)。这可用于定义设备和其他单元之间的依赖关系。要标记udev
设备udev
,请在规则文件中使用“TAG+="systemd"” ,请参阅udev(7)
有关详细信息。
我曾尝试查看 /lib/systemd/system,如 Debian Wiki 中所述:
Debian 提供的单元文件位于 /lib/systemd/system 目录中。
但这些都无处可寻。
然而
~$ sudo systemctl list-units --type=device
Run Code Online (Sandbox Code Playgroud)
是否显示设备单元(如磁盘、声卡、以太网控制器等...)
我想知道在 Debian 中哪里可以找到设备单元文件?或者如果这些不存在,那么为什么不存在,systemd 如何在 Debian 中处理这些单元?
任何澄清/评论/见解将不胜感激。
谢谢MK。拉哈尔
我正在尝试创建一个 systemd 服务,该服务仅在文件系统上不存在某个文件时才启动。
如果我使用ConditionPathExists
这将使服务仅在有问题的文件存在时启动,这与我想要的行为相反。
有没有办法反转这些条件?
在我的 Arch 服务器上,我设置的用户仅限于他们的主目录。我跑了:
useradd -m -s /bin/bash username
和 passwd username
我读过这篇维基文章...
我想我应该使用 systemd 用户服务让每个用户在启动时运行一个节点服务器。所以我登录了一个用户帐户su username
并创建了一个~/.config/systemd/user/serve.service
包含以下内容的文件:
[Unit]
Description=One of the servers
[Service]
ExecStart=/usr/bin/node /home/username/server.js
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
然后我跑systemctl --user enable serve.service
了响应Failed to connect to bus: Permission denied
据我所知,我应该systemctl --user ...
以用户身份而不是 root 身份运行命令。
那么我在这个配置中错过了什么?
我正在尝试使 systemd 服务基于多个主机名模式有条件启动。
我尝试过这个但没有运气:
root@linkbox-BI034415:/# systemctl cat mcbapp
# /lib/systemd/system/myservice.service
[Unit]
Description=My Service
Wants=another.service
After=another.service
ConditionHost=HostOne*|HostTwo*
Also tried
ConditionHost={HostOne*,HostTwo*}
[Service]
EnvironmentFile=/etc/default/myenv
ExecStart=/opt/bin/my-apps
Restart=on-failure
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
systemd ×8
systemd-unit ×8
debian ×2
services ×2
arch-linux ×1
bash ×1
date ×1
ubuntu ×1
users ×1