SAP(或任何其他应用程序)的 systemd 服务定义启动

SAP(或任何其他应用程序)的 systemd 服务定义启动

我在配置 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

相关内容