我已经花了好几天的时间来解决这个令人难以置信的问题,而且我没有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.service
和cdpdaemon.service
,则必须将这些行放在cdpdaemon.service
单元文件中:
[Unit] Requires=cdpagentproxy.service After=cdpagentproxy.service
(当然,将这些行放入现有的[Unit]
部分中,我只是为了完整而包含了部分标题)。
然后运行systemctl daemon-reload
,同时systemctl daemon-reload
这两个进程并尝试手动启动单元,或者直接将其添加到自动启动和重新启动。