File: systemd.sh

package info (click to toggle)
snapd 2.49-1%2Bdeb11u2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 36,432 kB
  • sloc: ansic: 12,125; sh: 8,453; python: 2,163; makefile: 1,284; exp: 173; xml: 22
file content (69 lines) | stat: -rw-r--r-- 2,281 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash

# Create and start a persistent systemd unit that survives reboots. Use as:
#   systemd_create_and_start_unit "name" "my-service --args"
# The third arg supports "overrides" which allow to customize the service
# as needed, e.g.:
#   systemd_create_and_start_unit "name" "start" "[Unit]\nAfter=foo"
systemd_create_and_start_unit() {
    printf '[Unit]\nDescription=Support for test %s\n[Service]\nType=simple\nExecStart=%s\n[Install]\nWantedBy=multi-user.target\n' "${SPREAD_JOB:-unknown}" "$2" > "/etc/systemd/system/$1.service"
    if [ -n "${3:-}" ]; then
        mkdir -p "/etc/systemd/system/$1.service.d"
        # shellcheck disable=SC2059
        printf "$3" >> "/etc/systemd/system/$1.service.d/override.conf"
    fi
    systemctl daemon-reload
    systemctl enable "$1"
    systemctl start "$1"
    wait_for_service "$1"
}

systemd_stop_and_remove_unit() {
    systemctl stop "$1" || true
    systemctl disable "$1" || true
    rm -f "/etc/systemd/system/$1.service"
    rm -rf "/etc/systemd/system/$1.service.d"
    systemctl daemon-reload
}

wait_for_service() {
    local service_name="$1"
    local state="${2:-active}"
    for i in $(seq 300); do
        if systemctl show -p ActiveState "$service_name" | grep -q "ActiveState=$state"; then
            return
        fi
        # show debug output every 1min
        if [ "$i" -gt 0 ] && [ $(( i % 60 )) = 0 ]; then
            systemctl status "$service_name" || true;
        fi
        sleep 1;
    done

    echo "service $service_name did not start"
    exit 1
}

systemd_stop_units() {
    for unit in "$@"; do
        if systemctl is-active "$unit"; then
            echo "Ensure the service is active before stopping it"
            retries=20
            while systemctl status "$unit" | grep -q "Active: activating"; do
                if [ $retries -eq 0 ]; then
                    echo "$unit unit not active"
                    systemctl status "$unit" || true
                    exit 1
                fi
                retries=$(( retries - 1 ))
                sleep 1
            done

            systemctl stop "$unit"
        fi
    done
}

systemd_get_active_snapd_units() {
    systemctl list-units --plain --state=active|grep -Eo '^snapd\..*(socket|service|timer)' || true
}