在父退出后保持子进程处于活动状态

时间:2011-08-04 17:38:13

标签: c#

我正在为Windows服务编写autoupdater。这就是我希望它工作的方式(如果有更好的解决方案,请告诉我)

1) The service launches a child Process (the updater).
2) The child stops the parent service (I'm using sc.exe).
3) The child applies the updated .exe and .dll files for the parent.
4) The child starts the parent service.

我坚持#2,因为当我停止父服务时,子进程被终止。如何在C#中启动一个非小孩的新流程,它本身就存在?

2 个答案:

答案 0 :(得分:7)

您可以使用Process.Start来启动单独的独立流程:

E.g:

System.Diagnostics.Process.Start(@"C:\windows\system32\notepad.exe");

答案 1 :(得分:0)

您可以使用调度程序服务。虽然其他人建议可以直接这样做。

  1. 确保“计划”服务(又名“任务计划程序”)正在运行。
  2. 运行AT.EXESCHTASKS.EXE命令行实用程序以安排执行子进程。
  3. 等待停止事件到达服务,如果您在超时期限内没有收到,则表示您遇到问题;)根据计划的安排,您可以尝试再次运行。
  4. 我更喜欢schtasks命令,类似于以下内容:

      

    C:\> schtasks.exe /create /tn "My Updater" /sc once /ru System /sd 01/01/1999 /st 00:00 /tr "C:\Windows\System32\cmd.exe /c dir c: > c:\temp\ran.txt"

    这应该产生以下输出:

      

    WARNING: Task may not run because /ST is earlier than current time.
      SUCCESS: The scheduled task "My Updater" has successfully been created.

    注意,如果该名称的任务已经存在,则会产生覆盖提示。创建任务后,您可以随时运行它:

      

    C:\> schtasks.exe /run /tn "My Updater"
      SUCCESS: Attempted to run the scheduled task "My Updater".

    最后,您可以删除该任务,但需要确认:

      

    C:\> schtasks.exe /delete /tn "My Updater"
       WARNING: Are you sure you want to remove the task "My Updater" (Y/N)? y
       SUCCESS: The scheduled task "My Updater" was successfully deleted.

    因此,要使用这些命令,您只需要生成您选择的调度程序。当然,这也可以以编程方式完成;但是,我从来没有弄清楚到底是怎么回事;)

    由于同时使用了std :: out / err和std :: in,我强烈建议您阅读本文,了解如何使用How to use System.Diagnostics.Process correctly。另外,我建议使用一个好的wrapper API around Process.Start, like my own ProcessRunner class,这样你就不会因为等待进程退出而陷入僵局。