我们刚刚在 Windows Server 2012 上安装了 mrtg,但我无法让它作为服务运行。 我正在遵循这里的指南,但仍然陷入困境。
首先,如果我手动运行 mrtg,同时指定一个配置文件,它确实会工作并生成图表。
但是对于服务,我将文件srvany.exe
和instsrv.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.exe
(wperl
使用正确的命令行)在进程列表中运行。我可以通过修改批处理脚本来修改服务。
所以现在你可以用nssm stop mrtg
并开始nssm start mrtg
(或者如果你愿意,你也可以管理其他 Windows 服务)