我需要一些帮助。所有变量都在下面。希望有人可以帮助阐明这个问题。
我在Windows域上运行的Windows Server 2003 VM框上运行专有处理软件。
基本上这个软件是可执行文件,它是从域帐户手动运行的(登录并手动打开桌面上的快捷方式)
此软件作为命令提示符运行,并且每隔一段时间(几天)它就会在没有警告的情况下关闭。我们通过Nagios监控和VNC收到提醒,然后重新启动流程。此服务器正在生产中,这是不切实际的。我们正在尝试使用一个检查进程的脚本,如果它没有运行则启动它。
我们将此流程转换为Windows服务,由于软件的性质,它无法作为服务运行。
我们尝试使用Nagios脚本重新启动服务,但是关键字服务此软件无法作为服务运行,因此这不是一个选项。
我们尝试了一个名为ReStartMe的程序。它对我们没用;它崩溃了软件。
我们在线找到了一个重启应用程序脚本,它确实重新启动了应用程序。但是,应用程序启动不当,停止,关闭,并再次重新启动。
我们认为这是因为应用程序在shell中启动,并且可能没有正确的用户权限来运行可执行文件。它不等同于在桌面上打开身份验证的用户。
此脚本的代码粘贴在下面。我们希望有人可以帮助我们解决这个问题。解决这个问题会给我们带来很多麻烦。
set Service = GetObject ("winmgmts:")
set Shell = WScript.CreateObject("WScript.Shell")
'Name of the EXE file we want to watch
sEXEName = "processing.exe"
'Path of the folder it is in (Don't forget the trailing \)
sApplicationPath = "C:\process\"
'Loop until the system is shutdown or user logs out
while true
bRunning = false
'Look for our application. Set the flag bRunning = true
'If we see that it is running
for each Process in Service.InstancesOf ("Win32_Process")
if Process.Name = sEXEName then
bRunning=true
End If
next
'Is our application running?
if (not bRunning) then
'No it is not, launch it
Shell.Run Chr(34) & sApplicationPath & sEXEName & Chr(34)
end if
'Sleep a while so we do not hog the CPU
WScript.Sleep(2000)
wend
答案 0 :(得分:0)
尝试使用ShellExecute
代替Run
:
If Not bRunning Then
Set app = CreateObject("Shell.Application")
app.ShellExecute Chr(34) & sApplicationPath & sEXEName & Chr(34), , _
sApplicationPath, , 1
End If
我可能会首先尝试批处理脚本。 start /wait processing.exe
应该启动应用程序并等待它终止。如果可行(不适用于某些应用程序),您可以创建如下的批处理脚本:
@echo off
cd C:\process
:LOOP
start "" /wait processing.exe
ping -n 2 127.0.0.1 >nul 2>&1
goto LOOP
并使用用户启动文件夹中设置的“run as admin”标志创建该批处理脚本的快捷方式。这样程序应该以提升的权限自动启动,并且应该在崩溃时自动重新启动。 ping
仅用于在重新启动之前添加一个短暂的延迟,以便在进程崩溃后给系统一些时间进行清理。