Unix

systemctl wrapper

ForceCore 2023. 3. 30. 22:54

systemctl 과 pm2를 비교하면 명령어가 쉽다는거...? display를 예쁘게 해준다는거? 이 두 개 정도가 많이 아쉽다.

또 아쉬운 것은 pm2 start "명령어" 치면 바로 그냥 시작을 해준다는 거...

pm2 start정도로 쉽진 않지만 그래도 pm2는 자체버그가 많아서 간간이 탈을 내는 편임. 다시 systemctl --user로 돌아옴. 다만 wrapper를 작성했다.

 

#!/usr/bin/perl
my $scu = "systemctl --user";

my $cmd = shift;
my $args = join(' ', @ARGV);
if ($cmd eq "") {
    system("$scu list-unit-files --type=service");
    system("$scu list-units --type=service --all");
}
elsif ($cmd eq "ls") {
    system("$scu list-unit-files --type=service");
    system("$scu list-units --type=service --all");
}
elsif ($cmd eq "status" || $cmd eq "st") {
    system("$scu status $args");
}
elsif ($cmd eq "log") {
    my $unit = shift;
    my $multitail = "multitail -cS zarafa -J";
    if ($unit) {
        system("journalctl --user -f -u $unit | $multitail");
    }
    else {
        system("journalctl --user -f | $multitail");
    }
}
else {
    system("$scu $cmd $args");
    system("$scu list-units --type=service --all");
}

일단 이 정도면 그런대로 대충 쓸만하다. 결국 가장 큰 문제가, 명령어가 너무 길고, 무슨 서비스가 있는지 모른다는 점인데 이 정도면 그럭저럭 극복 됨.

 

multitail 명령어가 없으면 그냥 | $multitail 부분은 없애도 되는데 색깔이 안 입혀져서 조금 아쉬울 것이다.

 

 

2023-04-28:

#!/usr/bin/env python
import sys
import subprocess


def ls():
    unit_files = subprocess.run(f"{scu} list-unit-files --type=service", stdout=subprocess.PIPE, shell=True, text=True).stdout.splitlines()
    units = subprocess.run(f"{scu} list-units --type=service --all", stdout=subprocess.PIPE, shell=True, text=True).stdout.splitlines()
    blacklist = [
        "static",
        "systemd-tmpfiles-setup.service",
        "dbus.service",
        "dirmngr.service",
        "gpg-agent.service",
        "pk-debconf-helper.service",
        "snapd.session-agent.service",
    ]

    for line in unit_files:
        if not any(s in line for s in blacklist):
            print(line)

    for line in units:
        if not any(s in line for s in blacklist):
            print(line)


if __name__ == "__main__":
    scu = "SYSTEMD_COLORS=1 systemctl --user"

    cmd = sys.argv[1] if len(sys.argv) > 1 else ""
    args = " ".join(sys.argv[2:])

    if cmd == "":
        subprocess.run(f"{scu} list-unit-files --type=service", shell=True)
        subprocess.run(f"{scu} list-units --type=service --all", shell=True)
    elif cmd == "ls":
        ls()
    elif cmd in ["status", "st"]:
        subprocess.run(f"{scu} status {args}", shell=True)
    elif cmd == "log":
        unit = sys.argv[2] if len(sys.argv) > 2 else ""
        multitail = "multitail -cS zarafa -J"
        if unit:
            subprocess.run(f"journalctl --user -f -u {unit} | {multitail}", shell=True)
        else:
            subprocess.run(f"journalctl --user -f | {multitail}", shell=True)
    else:
        subprocess.run(f"{scu} {cmd} {args}", shell=True)

ChatGPT써서 파이썬으로 만들고 좀 개선을 했다. blacklist 넣어서 귀찮은거 안 보이게 만듦.