我在配置 systemd 服务以启动和停止 SAP(或任何其他应用程序)时遇到问题。我是配置 systemd 服务的新手,请原谅我问了一些“愚蠢”的问题。
我想要/计划的是:
本例中的应用程序 SAP 安装在 /local/hana/H01 和 /local/hana/H01/DB 中的本地磁盘上;这些是文件系统,由 fstab 挂载。
有一个启动 SAP 的脚本,位于 /local/hana/H01/bin/hana。如果使用参数“start”调用此脚本,它将启动 SAP;如果使用参数“stop”调用此脚本,它将终止 SAP。此脚本将在 SAP 启动后终止,但 SAP 进程将保持在线。
此 SAP 实例配置了一个额外的 NIC eth0:1;SAP 应在该 NIC 可用后启动。SAP 管理员发现通过 ssh 登录到主机检查问题很方便,因此如果 SAP 没有关闭,他们希望通过 ssh 连接进行检查;sshd 不应在 SAP/应用程序关闭之前终止。
/local/hana/H01/bin/hana(或任何其他应用程序脚本)将启动带有超时脚本的命令以防止锁定。
我曾经使用 init.d 框架并使用运行级别 4 在启动过程的后期启动我的应用程序。
我已经创建了一个服务配置,我从现有服务中重复使用它,所以我还不了解所有选项和依赖项。我需要这些运行级别吗?.target 依赖项?它在示例文件中。
[Unit]
Description=System Resources for SAP HANA H01
Requires=local-fs.target
After=local-fs.target
Before=runlevel2.target
Before=runlevel3.target
Before=runlevel4.target
Before=runlevel5.target
Before=shutdown.target
Requires=network.target
After=network-online.target
After=network.service
After=sshd.service
After=local-fs.target
Conflicts=shutdown.target reboot.target
[Service]
Type=forking
Restart=no
StandardOutput=syslog
StandardError=syslog+console
TimeoutSec=0
IgnoreSIGPIPE=no
KillMode=process
RemainAfterExit=yes
ExecStart=/local/hana/H01/bin/hana start
ExecStop=/local/hana/H01/bin/hana stop
[Install]
WantedBy=multi-user.target
我遗漏了什么吗?太多了?有什么建议我应该添加或删除吗?
谢谢 Fran
答案1
总结一下评论:
把事情简单化!
[Unit]
Description=System Resources for SAP HANA H01
Requisite=network-online.target
After=network-online.target
[Service]
Type=forking
Restart=no
ExecStart=/local/hana/H01/bin/hana start
ExecStop=/local/hana/H01/bin/hana stop
[Install]
WantedBy=multi-user.target
应该以此作为开始,然后根据需要从那里进行迭代。更多示例:手册页
更新于 2024-03-19 - 编辑添加Requisite
,原因是在 SF 上注明
答案2
经过近一年的尝试和错误,我终于发现了为什么我的进程在关机脚本之前就终止了:
这就是我启动 DB 和 HANA 的方法。请注意 runuser 的不同选项 -u 和 -l!
root# cat /local/hana/H01/bin/hana
#!/bin/bash
# simplified version of the start/stop script
runuser -u h01db /local/hana/H01/bin/hanadb.sh start
runuser -l h01hana /local/hana/H01/bin/hanaapp.sh start
在我的测试场景中,我看到我的虚拟进程(我使用 /usr/bin/yes <参数>)正在运行 - 完美!
root# ps -elf | grep yes | grep -v grep
h01db 66925 1 95 13:12 ? 00:00:01 /usr/bin/yes dbstart
h01hana 66948 1 93 13:12 ? 00:00:01 /usr/bin/yes appstart
但是对于运行该过程的切片而言,存在巨大的差异:
root# systemd-cgls
|-1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
|-user.slice
| |-user-3001.slice
| | `-session-c15.scope
| | `-66948 /usr/bin/yes appstart
----- uninteresting stuff -----
`-system.slice
|-myapp.service
| `-66925 /usr/bin/yes dbstart
|-node_exporter.service
----- more uninteresting stuff -----
- system.slice 中的进程将被 ExecStop= 命令停止
- user.slice 中的进程将被 systemd 自行杀死!
更多信息:请参阅runuser
和的手册页systemd-cgls