【问题标题】:Devops Shutdown servicesDevops 关闭服务
【发布时间】:2020-07-10 17:34:12
【问题描述】:

我正在尝试在管道上的 DevOps 中找到一种方法,以便能够在安全的情况下关闭 Windows 服务。 例如。我们有一个持续运行的服务,但有时我们需要优雅地关闭它,我们通过 MSSQL 将表中的某些内容设置为 true,然后服务将优雅地关闭其连接,然后更新表以表示可以停止服务,手动这没问题,但我们想通过 DevOps 管道发布自动化流程

所以我的想法如下:

  1. 在表上发送 update set 命令以设置为 true 以便可以关闭
  2. 使用 where name = service name 监视表,直到它有该服务的行
  3. 从 PowerShell 或管道发送命令,表示可以关闭服务

1 和 3 看起来很简单,但是对于我来说,我似乎无法弄清楚如何不断检查表格直到它有一行

我发现我可以做到

SELECT CASE WHEN EXISTS(SELECT 1 FROM ShutdownLog WHERE Name = 'ServiceName') THEN 0 ELSE 1 END AS IsEmpty;

这基本上显示一次是空的,但是我如何循环这个查询直到它有数据?

我的计划是运行一个存储过程,它会执行选项 1,然后运行循环选项 2,如果满足则返回 True,然后在 DevOps 中我只需发送一个命令到存储过程以查看 if = true 我猜..

【问题讨论】:

  • 我猜你可以在 powershell 中循环来轮询表格。
  • 更好的方法是在您的服务中实现取消支持。如果操作系统出于某种原因决定停止您的服务,则不会触发您的自定义代码以正常关闭。 docs.microsoft.com/en-us/dotnet/standard/threading/…

标签: sql-server powershell loops devops azure-pipelines-release-pipeline


【解决方案1】:

您可以使用powershell Invoke-Sqlcmd (documentation)

使用以下查询:

UPDATE Table
    SET Column = 'True'
Where Name = 'StopService'

等待查询:

 -- Loop until there is a row with value = 'ServiceName'

DECLARE @ServiceName VARCHAR(100) = 'YourServiceName'
DECLARE @Index INT = 0
DECLARE @MaxTries INT = 10

WHILE NOT EXISTS (SELECT 1 FROM ShutdownLog WHERE Name = @ServiceName)
BEGIN
    
    IF @Index > @MaxTries
    BEGIN
        SELECT 'Max retries exceeded' as Message
        BREAK;
    END

    -- sleep for 10 Seconds
    WAITFOR DELAY '00:00:10'
    SET @Index = @Index + 1
END

SELECT CONCAT(@ServiceName, ' was stopped')  as Message

【讨论】:

  • 非常感谢,这似乎可行,但必须稍作更改,因为它似乎只是说如果找不到就成功完成,但我将 And index 替换为 OR index 并运行到最大重试。但是我怎么能说那里有一行我只是得到一个无限循环,如果我添加打印语句,我会得到很多行说有一行,如果我搜索不在表中的东西,它会执行 10 次它应该
  • 更新了答案
  • 感谢您的帮助,它仍然没有完全工作,我尝试更新它并测试不同的方式,但它基本上目前正在执行以下操作:服务名称 = BOB(这不会出现在表)未找到 bob 的循环表,然后出现 Max Retries 超出,然后 BOB 停止,所以我的 PS 脚本看到它已停止,然后关闭服务,但它没有停止如果我摆脱了最后一行和搜索日志中的服务我得到命令成功完成
【解决方案2】:

您可以尝试Azure Functions,Azure Functions 是一种事件驱动、按需计算的体验,它扩展了现有的 Azure 应用程序平台,能够实现由 Azure 或第三方服务中发生的事件触发的代码以及 on-房地系统。 Azure Functions 允许开发人员通过连接到数据源或消息传递解决方案来采取行动,从而轻松处理和响应事件。

我们可以使用 Azure 函数绑定存储队列消息轻松做到这一点。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue-trigger?tabs=csharp

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2022-07-18
    • 2021-02-18
    • 2021-08-10
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多