You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言中获取sshd服务状态?现有代码优化咨询

Optimizing Your Go Code to Capture SSHD Service State

Let's break down how to fix this so you can get the exact service state regardless of whether sshd is running or stopped:

Key Issues with the Current Code

  • The systemctl check command doesn't exist in systemd — this is likely a typo. You'll want to use either systemctl is-active (for concise state output) or systemctl status (for detailed info).
  • You're exiting immediately when the command returns an error, but systemd commands return non-zero exit codes for expected states like "inactive" or "failed" — these aren't errors you should abort on.

Optimization Steps

  • Use systemctl is-active for clean state output: This command returns a short, machine-readable state string (e.g., active, inactive, failed) and uses exit codes to indicate state:
    • Exit code 0: Service is active
    • Exit code 3: Service is inactive
    • Exit code 1: Service is in a failed state
  • Don't exit on non-zero exit codes immediately: Instead, capture both the output and the error, then inspect the exit code and output to determine the actual state.
  • Handle all possible states: Print the state clearly, and only exit if there's an unexpected error (like the systemctl command not being found, not just the service being stopped).

Updated Code Example

package main

import (
	"errors"
	"fmt"
	"os"
	"os/exec"
	"strings"
)

func main() {
	// Use systemctl is-active for concise, machine-readable state
	cmd := exec.Command("systemctl", "is-active", "sshd")
	out, err := cmd.CombinedOutput()
	state := strings.TrimSpace(string(out))

	var exitErr *exec.ExitError
	if errors.As(err, &exitErr) {
		// Non-zero exit code is expected for inactive/failed states
		switch exitErr.ExitCode() {
		case 3:
			fmt.Printf("Status is: %s\n", state)
		case 1:
			fmt.Printf("Status is: %s (service has failed)\n", state)
		default:
			fmt.Printf("Unexpected error checking sshd state: %v\n", err)
			os.Exit(1)
		}
	} else if err != nil {
		// Handle actual errors (e.g., systemctl not found, permission issues)
		fmt.Printf("Failed to run systemctl command: %v\n", err)
		os.Exit(1)
	} else {
		// Exit code 0 means service is active
		fmt.Printf("Status is: %s\n", state)
	}

	// Continue execution regardless of service state (as requested)
	fmt.Println("Starting Role")
}

Explanation

  • We use systemctl is-active because it's designed for programmatic use — no need to parse long status outputs.
  • We check if the error is an exec.ExitError (which wraps exit codes from the command) and handle expected exit codes (1 and 3) by printing the state instead of exiting.
  • Only unexpected errors (like the systemctl command not existing) will trigger an exit.
  • The service state is trimmed to remove any extra newlines or whitespace.

内容的提问来源于stack exchange,提问作者Adrian Cincu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:12:47