检查ubuntu服务是否已在C#中停止的最佳方法

时间:2019-03-06 12:12:01

标签: c# azure ubuntu-16.04

我想在Azure虚拟机(Ubuntu 16.04)中的服务(grafana或influxdb)停止时得到警报。我想使用c#连接到VM,并检查grafana和influxdb服务的状态。任何人都可以共享实现此目的的代码示例吗?

2 个答案:

答案 0 :(得分:0)

这是您可以用来在c#中使用SSH连接到Azure linux的东西

using (var client = new SshClient("my-vm.cloudapp.net", 22, "username", "password​"))
        {
            client.Connect();
            Console.WriteLine("it worked!");
            client.Disconnect();
            Console.ReadLine();
        }

通常SSH服务器仅允许公共密钥身份验证或其他两个因素身份验证。

更改您的/ etc / ssh / sshd_configuncomment #PasswordAuthentication是

# Change to no to disable tunnelled clear text passwords
 #PasswordAuthentication yes

稍后您可以轮询已安装的服务。

对于另一种解决方案,您还可以在linux VM中部署rest api,以检查服务的状态,并从C#httpclient对其进行调用。

希望有帮助

答案 1 :(得分:0)

这两个服务都提供运行状况终结点,可用于从远程服务器检查其状态。无需打开远程外壳连接。实际上,如果必须对每个服务器场进行SSH,则不可能监视大型服务器场。

在最简单的情况下,无需理会网络问题,只需点击运行状况端点即可检查这两种服务的状态。一个粗略的实现可能看起来像这样:

public async Task<bool> CheckBoth()
{
    var client = new HttpClient
    {
        Timeout = TimeSpan.FromSeconds(30)
    };

    const string grafanaHealthUrl = "https://myGrafanaURL/api/health";
    const string influxPingUrl = "https://myInfluxURL/ping";

    var (grafanaOK, grafanaError) = await CheckAsync(client, grafanaHealthUrl,
                                                     HttpStatusCode.OK, "Grafana error");
    var (influxOK, influxError) = await CheckAsync(client, influxPingUrl, 
                                                   HttpStatusCode.NoContent,"InfluxDB error");

    if (!influxOK || !grafanaOK)
    {
                //Do something with the errors
                return false;
    }
    return true;

}

public async Task<(bool ok, string result)> CheckAsync(HttpClient client,
                                                       string healthUrl, 
                                                       HttpStatusCode expected,
                                                       string errorMessage)
{
    try
    {
        var status = await client.GetAsync(healthUrl);
        if (status.StatusCode != expected)
        {
            //Failure message, get it and log it
            var statusBody = await status.Content.ReadAsStringAsync();
            //Possibly log it ....
            return (ok: false, result: $"{errorMessage}: {statusBody}");
        }
    }
    catch (TaskCanceledException)
    {
        return (ok: false, result: $"{errorMessage}: Timeout");
    }
    return (ok: true, "");
}

也许更好的解决方案是定期使用Azure Monitor ping the health URLs并在它们关闭时发送警报。