Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ If your system isn't running (or targeting another system running) `systemctl`,
## Helper functionality

- [x] Get start time of a service (`ExecMainStartTimestamp`) as a `Time` type
- [x] Get current memory in bytes (`MemoryCurrent`) an an int
- [x] Get current memory in bytes (`MemoryCurrent`) as an int
- [x] Get the PID of the main process (`MainPID`) as an int
- [x] Get the restart count of a unit (`NRestarts`) as an int

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module github.com/taigrr/systemctl

go 1.18
go 1.21
13 changes: 8 additions & 5 deletions helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func GetNumRestarts(ctx context.Context, unit string, opts Options) (int, error)
return strconv.Atoi(value)
}

// Get current memory in bytes (`systemctl show [unit] --property MemoryCurrent`) an an int
// Get current memory in bytes (`systemctl show [unit] --property MemoryCurrent`) as an int
func GetMemoryUsage(ctx context.Context, unit string, opts Options) (int, error) {
value, err := Show(ctx, unit, properties.MemoryCurrent, opts)
if err != nil {
Expand All @@ -56,6 +56,7 @@ func GetPID(ctx context.Context, unit string, opts Options) (int, error) {
return strconv.Atoi(value)
}

// GetSocketsForServiceUnit returns the socket units associated with a given service unit.
func GetSocketsForServiceUnit(ctx context.Context, unit string, opts Options) ([]string, error) {
args := []string{"list-sockets", "--all", "--no-legend", "--no-pager"}
if opts.UserMode {
Expand All @@ -81,6 +82,7 @@ func GetSocketsForServiceUnit(ctx context.Context, unit string, opts Options) ([
return sockets, nil
}

// GetUnits returns a list of all loaded units and their states.
func GetUnits(ctx context.Context, opts Options) ([]Unit, error) {
args := []string{"list-units", "--all", "--no-legend", "--full", "--no-pager"}
if opts.UserMode {
Expand Down Expand Up @@ -109,6 +111,7 @@ func GetUnits(ctx context.Context, opts Options) ([]Unit, error) {
return units, nil
}

// GetMaskedUnits returns a list of all masked unit names.
func GetMaskedUnits(ctx context.Context, opts Options) ([]string, error) {
args := []string{"list-unit-files", "--state=masked"}
if opts.UserMode {
Expand Down Expand Up @@ -138,7 +141,7 @@ func GetMaskedUnits(ctx context.Context, opts Options) ([]string, error) {
return units, nil
}

// check if systemd is the current init system
// IsSystemd checks if systemd is the current init system by reading /proc/1/comm.
func IsSystemd() (bool, error) {
b, err := os.ReadFile("/proc/1/comm")
if err != nil {
Expand All @@ -147,7 +150,7 @@ func IsSystemd() (bool, error) {
return strings.TrimSpace(string(b)) == "systemd", nil
}

// check if a service is masked
// IsMasked checks if a unit is masked.
func IsMasked(ctx context.Context, unit string, opts Options) (bool, error) {
units, err := GetMaskedUnits(ctx, opts)
if err != nil {
Expand All @@ -161,8 +164,8 @@ func IsMasked(ctx context.Context, unit string, opts Options) (bool, error) {
return false, nil
}

// check if a service is running
// https://unix.stackexchange.com/a/396633
// IsRunning checks if a unit's sub-state is "running".
// See https://unix.stackexchange.com/a/396633 for details.
func IsRunning(ctx context.Context, unit string, opts Options) (bool, error) {
status, err := Show(ctx, unit, properties.SubState, opts)
return status == "running", err
Expand Down
15 changes: 0 additions & 15 deletions structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,3 @@ type Unit struct {
Sub string
Description string
}

var unitTypes = []string{
"automount",
"device",
"mount",
"path",
"scope",
"service",
"slice",
"snapshot",
"socket",
"swap",
"target",
"timer",
}
2 changes: 1 addition & 1 deletion systemctl.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ func Start(ctx context.Context, unit string, opts Options) error {
// Get back the status string which would be returned by running
// `systemctl status [unit]`.
//
// Generally, it makes more sense to programatically retrieve the properties
// Generally, it makes more sense to programmatically retrieve the properties
// using Show, but this command is provided for the sake of completeness
func Status(ctx context.Context, unit string, opts Options) (string, error) {
stat, err := status(ctx, unit, opts)
Expand Down
14 changes: 8 additions & 6 deletions systemctl_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package systemctl

import (
"context"
"regexp"
"strings"

"github.com/taigrr/systemctl/properties"
Expand Down Expand Up @@ -148,14 +147,17 @@ func isFailed(ctx context.Context, unit string, opts Options) (bool, error) {
args[1] = "--user"
}
stdout, _, _, err := execute(ctx, args)
if matched, _ := regexp.MatchString(`inactive`, stdout); matched {
stdout = strings.TrimSuffix(stdout, "\n")
switch stdout {
case "inactive":
return false, nil
} else if matched, _ := regexp.MatchString(`active`, stdout); matched {
case "active":
return false, nil
} else if matched, _ := regexp.MatchString(`failed`, stdout); matched {
case "failed":
return true, nil
default:
return false, err
}
return false, err
}

// Mask one or more units, as specified on the command line. This will link
Expand Down Expand Up @@ -210,7 +212,7 @@ func start(ctx context.Context, unit string, opts Options) error {
// Get back the status string which would be returned by running
// `systemctl status [unit]`.
//
// Generally, it makes more sense to programatically retrieve the properties
// Generally, it makes more sense to programmatically retrieve the properties
// using Show, but this command is provided for the sake of completeness
func status(ctx context.Context, unit string, opts Options) (string, error) {
args := []string{"status", "--system", unit}
Expand Down
2 changes: 0 additions & 2 deletions util.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import (

var systemctl string

const killed = 130

func init() {
path, _ := exec.LookPath("systemctl")
systemctl = path
Expand Down