让 MRTG 作为 Windows 服务运行

让 MRTG 作为 Windows 服务运行

我们刚刚在 Windows Server 2012 上安装了 mrtg,但我无法让它作为服务运行。 我正在遵循这里的指南,但仍然陷入困境。

首先,如果我手动运行 mrtg,同时指定一个配置文件,它确实会工作并生成图表。

但是对于服务,我将文件srvany.exeinstsrv.exe放在了c:\mrtg\bin (我从目录名中删除了版本号,所以现在所有文件都位于c:\mrtg)。

instsrv MRTG c:\mrtg\bin\srvany.exe

我将 regedit 文件合并到注册表中,如果我去查看,就会看到注册表项就在那里。您可以从 Perl 的路径中看到我安装了 64 位版本的 Perl。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRTG-PA500\Parameters]
 "Application"="c:\\perl64\\bin\\wperl.exe"
 "AppParameters"="c:\\mrtg\\bin\\mrtg --logging=eventlog c:\\mrtg\\bin\\mrtg-MyDevice.cfg"
 "AppDirectory"="c:\\mrtg\\bin\\"

现在,在我完成所有这些之后,服务确实创建了,但是当我尝试启动它时,它会启动然后停止。

因此我为该服务创建了一个域帐户并将其分配给该服务,并授予 mrtg 目录及其 web 目录的读/写/修改权限,但它仍然无法启动。

我错过了什么?

[更新]

另外,如果我使用与注册表项中设置的命令行等效的命令行,那么我会发现一些奇怪的现象。

c:\mrtg\bin>perl mrtg --logging=eventlog mrtg-mydevice.cfg
Use of uninitialized value in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 73.
Argument "Started mrtg with config 'mrtg-mydevice.cfg'\n" isn't numeric in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 46.
Use of uninitialized value in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 199. Argument "WARN" isn't numeric in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 199.
Daemonizing MRTG ...
Do Not close this window. Or MRTG will die
Use of uninitialized value in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 73.
Use of uninitialized value in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 199. Argument "WARN" isn't numeric in subroutine entry at C:/Perl64/lib/Win32/EventLog.pm line 199.

[更新]

刚刚发现这个,其中指出 svrany.exe 并不真正适合 Windows 7(或之后的 Server 2012)。我知道 mrtg 网站上的一些链接相当旧了。也许我只是不能使用srvany

但我想我可能遇到了一些配置问题。

答案1

好吧!问题是 srvany.exe 在较新的 Windows 版本上无法正常工作。但是执行文件will! nssm代表非吸吮服务经理- 好听的名字!

因此我创建了一个包含该内容的批处理文件。

::Monday, June 15, 2015
::http://nssm.cc/download
::Apparently, srvany.exe doesn't work right on newer Windows, so I got a 64bit nssm (non-sucking service manager) to put in its place.
::commandline directions: http://nssm.cc/commands

nssm install mrtg wperl "mrtg --logging=eventlog mrtg-mydevice.cfg"
nssm set mrtg AppDirectory c:\mrtg\bin
nssm set mrtg displayname mrtg
nssm set mrtg description "MRTG wPerl Service"
nssm set mrtg start service_auto_start
nssm start mrtg

一旦我这样做了,服务就会立即启动。现在我可以看到nssm.exewperl使用正确的命令行)在进程列表中运行。我可以通过修改批处理脚本来修改服务。

所以现在你可以用nssm stop mrtg

并开始nssm start mrtg

(或者如果你愿意,你也可以管理其他 Windows 服务)

相关内容