sapcontrol/sapstartsrv

你还在用传统的startsap/stopsap脚本去启停SAP系统么?时至今日,相信依然有很多客户习惯用startsap/stopsap脚本来启停SAP系统。 小编想说的是,你依然可以使用startsap/stopsap脚本来启停系统,但是startsap/stopsap脚本已经在2015年4月停止维护,SAP推荐使用sapcontrol命令来启停SAP系统。 详情请参阅以下 SAP note。本文将具体阐述sapcontrol/sapstartsrv工作原理以及常见问题分析。

  • 809477 – startsap/stopsap for SAP WebAs 640, 700, 701, 710, 711, 720
  • 1763593 – Starting and stopping SAP system instances – startsap/stopsap are deprecated

我们先来讲讲什么是sapstartsrv,它是如何工作的 ?

sapstartsrv是SAP系统的启停服务,Windows OS上是以services(Services -> SAP<SID>_<inst.No>)形式存在的,UNIX/Linux OS上是daemon,它伴随着OS的启停而启停。

sapstartsrv主要提供的功能有:
  • SAP 实例(instance)的启停 (每一个instance都有相应的sapstartsrv服务)
  • monitor系统状态
  • 读取日志以及配置文件
  • 读取技术信息
sapstartsrv监听的端口:
  • HTTP port 5<xx>13 (or sapctrl<xx> in /etc/services
  • HTTPS port 5<xx>14 (or sapctrls<xx>) in /etc/services)

(<xx>代表instance number)

sapstartsrv安全通信:
  • 在UNIX/Linux OS, 它是用UNIX Domain Sockets (/tmp/.sapstream<port-no>)来通信
  • 在Windows OS则是用“Windows Named Pipe” (\\<host>\pipe\sapcontrol_<xx>)
sapstartsrv工作原理图:

                                                            UNIX/Linux OS

                                                          Windows OS

什么是sapcontrol? 与sapstartsrv有什么关系?他们如何一起工作的?

sapstartsrv 提供几十个webmethod。sapcontrol相当于client端,它通过UNIX domain sockets 或者 Windows named pipe 与server端的sapstartsrv进行通信,进而调用相应的webmethod来工作。你可以用<sid>adm用户登录到操作系统层面,直接执行sapcontrol,然后系统就会提示,sapcontrol命令的使用方法以及sapstartsrv 提供的webmethod。

startsap/stopsap脚本与sapcontrol/sapstartsrv 有着怎样的关系?

事实上, 无论是原来的startsap/stopsap脚本还是现在的SAP Management Console (SAP MMC), 他们其实都调用的sapcontrol命令。sapcontrol/sapstartsrv是下一代轻量级的、跨平台的、强大的系统管理服务。

 

下面我们来看看sapcontrol/sapstartsrv的常见问题有哪些,以及如何分析和解决?

1,Windows OS的“FAIL: HTTP Error, HTTP/1.1 401 Unauthorized”错误

经常有小伙伴在用sapcontrol启停系统的时候(e.g. sapcontrol -nr 00 -function Stop),系统提示:FAIL: HTTP Error, HTTP/1.1 401 Unauthorized。其实发生的原因很简单:

  • 一些重要的webmethod是被保护的,只有授权的用户/通信才能执行。(要是谁都能任意的启停系统,岂不是很恐怖?)
  • sapcontrol默认是使用HTTP与sapstartsrv通信,而在Windows OS,trusted的通信则是“Windows Named Pipe”

所以,解决办法很简单,只需要用PIPE protocol或者指明用户名以及密码就行。 例如:

sapcontrol -nr <NR> -prot PIPE -function <webmethod>

或者

sapcontrol -nr <NR> -user <user> <password> -function <webmethod>

2,Linux/Unix OS的“FAIL: NIECONN_REFUSED (Connection refused), NiRawConnect failed in plugin_fopen()”错误

    NIECONN_REFUSED其实是网络常见的错误,大家都知道和port有关。那么在本问题里面,port是谁呢?bingo,就是上文提到的5<xx>13(HTTP port) / 5<xx>14 (HTTPS port), 对应的UNIX Domain Sockets 是”/tmp/.sapstream<port-no>”。通常是因为这个UNIX Domain Sockets文件被删掉(因为在/tmp目录下)导致的。 所以,只需要重启一下sapstartsrv(命令如下),UNIX Domain Sockets就会自动生成出来,问题就解决了。例如:

sapcontrol -nr <nr> -function StartService <SID>

或者

“/usr/sap/<SID>/<instance>/exe/sapstartsrv pf=/usr/sap/<SID>/SYS/profile/<profile> -D -u <sid>adm” by <sid>adm user.

3,如何分析和解决sapstartsrv启动失败问题【Linux/Unix OS】?

例如: “sapcontrol -nr <nr> -function StartService <SID>” 命令返回OK,或者“sapstartsrv pf=<full path of instance profile> -D -u <sid>adm”没有任何error, 但是实际上sapstartsrv没有起来。

在sapstartsrv启动过程中,其中重要的2个步骤是:

  • 创建和访问lock file (/tmp/.sapstartsrv<NR>_sapstartsrv.log)
  • 创建和读写日志文件 (/usr/sap/<SID>/<INS>/work/sapstartsrv.log)

无论哪个步骤失败都会导致sapstartsrv启动失败。你可以手动的以DIALOG的模式去启动sapstartsrv来进一步的看发生了什么问题, 命令行是:”/usr/sap/<SID>/<instance>/exe/sapstartsrv pf=<full path of instance profile>”

典型的error如下:

Unable to open trace file sapstartsrv.log. (Error 11 Resource temporarily unavailable)

Unable to open trace file sapstartsrv.log. (Error 13 Permission denied)

Unable to open trace file sapstartsrv.log. (Error 20 Not a directory)

Unable to open trace file sapstartsrv.log. (Error 30 Read-only file system)

解决方法如下:

1) 查看SAPSYSTEM 参数是否是正确的设置在sapstartsrv 用的profile里面

2) 检查下面2个文件的ownership 和 permissions /usr/sap/<SID>/<INS>/work/sapstartsrv.log /tmp/.sapstartsrv<NR>_sapstartsrv.log is correct

(666 and 644 under <sid>adm:sapsys)

3) 通常/usr/sap/<SID>是一个mounted 目录,那么请确保它不是一个Read-only file system(你可以用”mount” OS 命令来检查)

4) /tmp 目录可以被任何人访问 (e.g. 777 属性)

4,如何分析复杂的sapcontrol/sapstartsrv问题?

sapcontrol相当于client,而sapstartsrv相当于server, 无论如何复杂的问题都离不开下面三种可能性:

  • client(sapcontrol) 和 server(sapstartsrv)之间的通信问题
  • server(sapstartsrv)问题(比如: sapstartsrv 进程没有反应或者死锁)
  • OS层面的问题

可以通过“sapcontrol -debug” 结果以及收集sapstartsrv 的 trace level 3日志来进一步判别到底是哪一个层面出了问题。详细内容请参考 KBA 2652459 – [Best Practice] How to troubleshoot sapcontrol/sapstartsrv common issues – Guided Answers

最后, 如有更多疑问,欢迎留言讨论。