【问题标题】:How to restart window service after a particular time如何在特定时间后重新启动窗口服务
【发布时间】:2024-05-18 04:10:02
【问题描述】:

我正在使用 c++ 在 VS2010 中创建一个窗口服务,想知道有没有办法在特定时间后重新启动服务,实际上我会让用户在 INI 文件中写入重新启动时间,并且服务应该能够重新启动那时。任何可用的示例代码或任何 api ???

【问题讨论】:

  • 您是否有特定原因希望定期重新启动服务?如果您遇到内存泄漏等问题,我建议您改为解决这些问题。
  • @JoachimPileborg 先生,我的项目要求我必须在用户写入 INI 文件的时间后重新启动服务
  • 请参阅此 SO 问题以从服务本身重新启动 *.com/questions/220382/…
  • 收听 ControlService() 向您发布的管理员请求是自愿的。您可以忽略他并以任何您想要的方式运行您的服务代码。当然,减去取悦管理员,如果你足够多地勾选他,他会卸载你的服务。

标签: c++ visual-studio-2010 visual-c++ service


【解决方案1】:

您可以使用_execl 加载和执行新的子进程。

这是一个简单的代码,说明了我是如何打开 Notepad++ 实例的:

#include <process.h>

int main(){
    _execl("C:\\Program Files\\Notepad++\\Notepad++.exe", "\\0");
    return 0;
}

这样您就可以拥有另一个进程,该进程实际上会停止您当前的进程并重新启动您的进程。

【讨论】:

    【解决方案2】:

    StartService API 可以启动 windows 服务,ControlService API 可以停止 windows 服务。

    【讨论】:

    • 这里真的可以用吗?该服务已经在运行,我认为 Windows 会阻止它运行两次。如果服务自行停止,它就不能再发出启动命令了。
    • 您无法启动另一个实例。但是您可以先停止它,然后再启动它。这些 API 将用于外部程序,而不是服务本身。
    • 服务从StartServiceCtrlDispatcher返回后能否调用?此时该过程显然仍然存在,但从 SCM 的角度来看,该服务不再运行。我懒得尝试自己,但我很想知道结果。
    【解决方案3】:

    添加一个scheduled task 来调用一个批处理文件

    net stop servicename
    net start servicename
    

    【讨论】:

    • 先生,我确实从 service.msc 启动和停止服务...没有其他方法可以让我们以编程方式重新启动服务...
    • @user1402643 看到超人的回复,也可以使用API​​。我建议的所有内容都可以通过 API 完成,但操作系统允许您“以编程方式”完成。
    • 如果net stop超时退出,而net start启动时服务状态仍为“停止”,则无需重启服务。
    最近更新 更多