C#窗口服务和启动/停止cmd.exe

时间:2011-06-10 19:39:56

标签: c# multithreading command-line windows-services

我有一个C#窗口服务,它运行一个批处理文件(.bat),然后执行一个java应用程序。该服务运行.bat文件(cmd.exe)没有问题。但是,当我尝试停止窗口服务时,cmd.exe进程不会死。如果我再次启动服务,则会堆叠新的cmd进程。

如何终止正在运行的cmd.exe进程?

代码:

    private const string BATCH_FILE_PATH_APPKEY = "Service_Batch_File_Path";
    private const string BATCH_FILE_DEFAULT = "Service.bat";

    private static Process _proc;
    private static bool _hasStarted = false;

    public AService()
    {
        InitializeComponent();
        _proc = new Process();
    }

    protected override void OnStart(string[] args)
    {
        try
        {

            string appDirectory = System.Windows.Forms.Application.ExecutablePath;
            appDirectory = appDirectory.Substring(0, appDirectory.LastIndexOf("\\"));
            string workingDirectory = appDirectory;
            string batchFilePath = string.Empty;
            batchFilePath = workingDirectory + "Service.bat";

            // Make sure it exists


            _proc.StartInfo = new ProcessStartInfo(batchFilePath);
            _proc.StartInfo.CreateNoWindow = true;
            _proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            _proc.Start();
            _hasStarted = true;
        }
        catch (System.Exception ex)
        {
            eventLog1.WriteEntry(ex.ToString() + "\n\nStack Trace:\n" + ex.StackTrace);
            OnStop();
        }
    }

    protected override void OnStop()
    {
        if (_hasStarted)
            _proc.CloseMainWindow();
            //_proc.Close(); 
    }

TIA, 亚历克斯。

3 个答案:

答案 0 :(得分:0)

_proc.Kill();

请参阅MSDN中的详细信息:Process.Kill Method

您可能会发现以下链接非常有用:Process.Close() is not terminating created process,c#

答案 1 :(得分:0)

您是否在服务的关闭处理中尝试了_proc.Kill()?这是异步的,你应该调用WaitForExit给它一个不错的机会离开。记录此逻辑中的任何故障或异常以供调查。

您还应该(为了清洁)在致电_proc.Close()后恢复WaitForExit(),以确保Dispose()正确调用Process。我知道您的服务即将退出,但这是一个好习惯,如果您决定在将来更动态地管理子流程,则意味着您不太可能泄漏。

答案 2 :(得分:0)

_proc.Kill()将起作用....但它将孤立你的java应用程序。我已经做了类似的事情,第三个过程开始了。您还需要知道要杀死哪个java进程。为此,您可以使用ParentProcess Performance Counter。

以下是使用ParentProcess performance counter的一些详细信息。

此外,您打算在Windows版本上部署它吗? WindowsServer2008似乎有一个cmd.exe和一个conhost.exe。这可能会给您带来麻烦(也可以通过了解父流程来解决这个问题。