需要帮助将init.d服务脚本转换为systemd(CentOS)

我已经花了好几天的时间来解决这个令人难以置信的问题,而且我没有select。

我正在为我们的网站使用CentOS 6.8服务器。 CentOS 6(Enterprise Linux 6或EL6)使用较早的init.d模型来启动脚本。 有一个我老板要求我使用的程序,SonicWALL CDP Agent。 他有一个SonicWALL备份服务器,他们的“代理”软件在后台运行,将特定的文件和文件夹备份到服务器。 它实际上build立在Acronis TrueImage之上,但这是另一回事。

最大的问题是他们的CDP代理使用Adobe AIR。 他们必须以这种方式将其devise成跨平台的(因为他们有Windows / OSX / Linux的安装程序),但是当然Adobe在一段时间之前完全停止在64位Linux上支持AIR。 他们的网站提供了一些安装步骤,但是可以追溯到Red Hat 5.5,甚至是6。

我确实设法通过遵循EL6的步骤来让EL安装在EL7上,只是注意到软件包名称在repos中的变化。 有趣的是,正常的GUI安装程序(AdobeAIRInstaller.bin)不起作用,甚至在以root身份运行时也会给出一些关于“也许你的pipe理员禁止安装”的错误),但是.rpm文件可以工作。

我有最新的:
adobeair核心,2.6.0-19170.noarch.rpm
adobeair-2.6.0-19170.i686.rpm

结合GTK2 i686库,这实际上工作。

但是,CDP Agent比这更复杂。 有两种系统服务需要运行,以便代理软件能够正常工作(如果您仔细想想,自动备份无论如何都需要这样做)。

然而,他们的安装程序已经有几年了,并将启动脚本放在init.d中。 这是“应该”在EL7中工作,但事实并非如此。 我花了几个小时摆弄这个,它根本不起作用。

所以基本上,有两个需要运行的二进制文件。 启动它们的命令是:

/sbin/cdp/cdpagentproxy /sbin/cdp/cdpdaemon start 

如果我打开一个terminal并手动运行这些terminal,它们就可以工作 – 而且我可以打开CDP代理并运行。 但是,由于init.d / systemd不兼容,它们不能在启动时启动。

所以我做了一些简单的“服务”,并把它们放在正确的位置上。 cdpdaemon.service文件,例如:

 [Unit] Description=CDP Daemon Service After=syslog.target network.target [Service] Type=forking ExecStart=/sbin/cdp/cdpdaemon start [Install] WantedBy=multi-user.target 

我把它放在/usr/lib/systemd/system/cdpdaemon.service并在/etc/systemd/system/multi-user.target.wants/cdpdaemon.service创build了一个符号链接。

但是,当我尝试检查状态时会发生什么情况:

 [root@localhost Desktop]# systemctl status cdpdaemon.service ● cdpdaemon.service - CDP Daemon Service Loaded: loaded (/usr/lib/systemd/system/cdpdaemon.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Sun 2016-08-21 22:08:13 EDT; 10s ago Process: 1596 ExecStart=/sbin/cdp/cdpdaemon start (code=exited, status=0/SUCCESS) Main PID: 1633 (code=exited, status=127) Aug 21 22:08:13 localhost.localdomain systemd[1]: Starting CDP Daemon Service... Aug 21 22:08:13 localhost.localdomain cdpdaemon[1596]: Starting process. Aug 21 22:08:13 localhost.localdomain systemd[1]: Started CDP Daemon Service. Aug 21 22:08:13 localhost.localdomain systemd[1]: cdpdaemon.service: main process exited, code=exited, status=127/n/a Aug 21 22:08:13 localhost.localdomain systemd[1]: Unit cdpdaemon.service entered failed state. Aug 21 22:08:13 localhost.localdomain systemd[1]: cdpdaemon.service failed. 

另一个做同样的事情。 它看起来像试图运行,但然后停止并报告一个错误。 如果我打开一个terminal,只需input/sbin/cdp/cdpdaemon start ,它就可以很好地工作。

我在这里做错了什么? 我不明白“目标”选项的不同types,也不了解“之后”和types。 (我基本上是一个工作服务,复制文本,并改变了命令)

我想另外一个办法是在某个时间运行一个cronjob(比如晚上11点,如果备份运行在午夜),那么运行这两个命令的方式似乎是错误的方法。

该程序运行,我不能让它自己运行,而不需要我启动这两个辅助进程。

编辑:我想我会提供安装.sh文件,以防万一。 你可以看到它在哪里检查你正在运行的发行版,并创buildinit.d脚本。

http://pastebin.com/FmrZcmcR

“types= fokring”是为了分叉一个孩子并将其放入后台并自己正常退出的服务。 看着你的输出,感觉就像你的程序不这样做。 如果将“Type = forking”更改为“Type = simple”,会发生什么情况?

首先,确定这些进程是否分叉。 如果您在terminal中启动“分叉”过程,则释放terminal并“进入后台”。 这样的过程需要Type=forking 。 否则,如果一个进程没有释放terminal,除非用Ctrl + C终止它,或者把它放在命令行的末尾,那么它就是Type=simple 。 就这么简单。

其次,你提到有两个进程必须按顺序启动。 你是否为他们写了单元文件? 如果没有,那么现在就做。

第三,不要忘记依赖关系。 如果后面的进程( /sbin/cdp/cdpdaemon start )依赖于前者( /sbin/cdp/cdpagentproxy ),则需要在单元文件中表示它们之间的需求和顺序依赖关系。

例如,如果您创build的单元文件分别名为cdpagentproxy.servicecdpdaemon.service ,则必须将这些行放在cdpdaemon.service单元文件中:

 [Unit] Requires=cdpagentproxy.service After=cdpagentproxy.service 

(当然,将这些行放入现有的[Unit]部分中,我只是为了完整而包含了部分标题)。

然后运行systemctl daemon-reload ,同时systemctl daemon-reload这两个进程并尝试手动启动单元,或者直接将其添加到自动启动和重新启动。