시스템 서비스가 부팅 시 시작되지 않지만 수동으로 시작할 수 있는 이유는 무엇입니까?

시스템 서비스가 부팅 시 시작되지 않지만 수동으로 시작할 수 있는 이유는 무엇입니까?

컴퓨터가 부팅될 때 무선 액세스 포인트를 시작하기 위해 systemd 서비스를 작성했습니다. 내 문제는 컴퓨터가 부팅될 때 실제로 시작되지 않고 그 이유를 알 수 없는 것 같다는 것입니다. 서비스를 수동으로 시작하면 문제가 없습니다.

wap.service시스템 장치 파일:

[Unit]
Description=Enable the Wireless Access Point
Requires=dnsmasq.service iptables.service NetworkManager.service
Before=dnsmasq.service
After=iptables.service NetworkManager.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/project/wap.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target

/project/wap.sh(중괄호는 Ansible/Jinja2 변수 대체입니다.):

#!/usr/bin/env bash

set -Eeuo pipefail

# Allow incoming DNS requests.
iptables -I INPUT -p udp --dport 53 -j ACCEPT -m comment --comment "DNS"

# Allow incoming DHCP requests.
iptables -I INPUT -p udp --dport 67 -j ACCEPT -m comment --comment "DHCP"

# Relinquish NetworkManager control over the wireless network interface.
nmcli r wifi off
rfkill unblock wifi

# Up and configure the wireless network interface.
ifconfig {{ap_interface}} 192.168.2.1 up
route add -net 0.0.0.0 netmask 255.255.255.0 gw 192.168.2.1 || true

# Restart hostapd so it can successfully bind to the newly configured wireless network interface.
service hostapd restart

관련 /usr/lib/systemd/systemd --test --system --unit=default.target출력:

    -> Unit wap.service:
        Description: Enable the Wireless Access Point
        Instance: n/a
        Unit Load State: loaded
        Unit Active State: inactive
        Inactive Exit Timestamp: n/a
        Active Enter Timestamp: n/a
        Active Exit Timestamp: n/a
        Inactive Enter Timestamp: n/a
        GC Check Good: no
        Need Daemon Reload: no
        Transient: no
        Slice: system.slice
        CGroup: n/a
        CGroup realized: no
        CGroup mask: 0x0
        CGroup members mask: 0x0
        Name: wap.service
        Fragment Path: /etc/systemd/system/wap.service
        Requires: dnsmasq.service
        Requires: NetworkManager.service
        Requires: basic.target
        Requires: iptables.service
        Wants: system.slice
        WantedBy: multi-user.target
        Conflicts: shutdown.target
        Before: dnsmasq.service
        Before: multi-user.target
        Before: shutdown.target
        After: systemd-journald.socket
        After: iptables.service
        After: NetworkManager.service
        After: system.slice
        After: basic.target
        References: systemd-journald.socket
        References: iptables.service
        References: NetworkManager.service
        References: system.slice
        References: dnsmasq.service
        References: shutdown.target
        References: basic.target
        ReferencedBy: multi-user.target
        StopWhenUnneeded: no
        RefuseManualStart: no
        RefuseManualStop: no
        DefaultDependencies: yes
        OnFailureJobMode: replace
        IgnoreOnIsolate: no
        IgnoreOnSnapshot: no
        Service State: dead
        Result: success
        Reload Result: success
        PermissionsStartOnly: no
        RootDirectoryStartOnly: no
        RemainAfterExit: yes
        GuessMainPID: yes
        Type: oneshot
        Restart: no
        NotifyAccess: none
        NotifyState: unknown
        KillMode: control-group
        KillSignal: SIGTERM
        SendSIGKILL: yes
        SendSIGHUP:  no
        UMask: 0022
        WorkingDirectory: /
        RootDirectory: /
        NonBlocking: no
        PrivateTmp: no
        PrivateNetwork: no
        PrivateDevices: no
Loaded units and determined initial transaction in 75ms.        ProtectHome: no
        ProtectSystem: no

        IgnoreSIGPIPE: yes
        LimitNOFILE: 1024 4096
        StandardInput: null
        StandardOutput: journal
        StandardError: inherit
        SyslogFacility: daemon
        SyslogLevel: info
        -> ExecStart:
            Command Line: /project/wap.sh

다시 시작한 후 서비스 상태:

$ sudo service wap status -l
Redirecting to /bin/systemctl status  -l wap.service
● wap.service - Enable the Wireless Access Point
   Loaded: loaded (/etc/systemd/system/wap.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

수동 시작 후 서비스 상태:

$ sudo service wap start
Redirecting to /bin/systemctl start wap.service
$ sudo service wap status -l
Redirecting to /bin/systemctl status  -l wap.service
● wap.service - Enable the Wireless Access Point
   Loaded: loaded (/etc/systemd/system/wap.service; enabled; vendor preset: disabled)
   Active: active (exited) since do 2019-09-26 12:10:40 BST; 6s ago
  Process: 8589 ExecStart=/project/wap.sh (code=exited, status=0/SUCCESS)
 Main PID: 8589 (code=exited, status=0/SUCCESS)

sep 26 12:10:40 localhost.localdomain systemd[1]: Starting Enable the Wireless Access Point...
sep 26 12:10:40 localhost.localdomain wap.sh[8589]: Redirecting to /bin/systemctl restart hostapd.service
sep 26 12:10:40 localhost.localdomain systemd[1]: Started Enable the Wireless Access Point.

journalctl산출:

$ journalctl -u wap
-- No entries --

머신이 시작될 때 절대로 실행되지 않는 것을 확인했지만 wap.sh시스템 로그에서 이 서비스에 대한 시작 시도 등의 정보를 찾을 수 없습니다.

너무 길다. 부팅 시 서비스가 시작되어야 하는데 그렇지 않으며 그 이유를 이해할 수 없습니다.

답변1

어쩌면 그렇게 간단할까요? :

systemctl은 wap.service를 활성화합니다.

답변2

내 문제의 원인은 존재하지 않는 대상으로 밝혀졌습니다. 대신 런레벨 3에 해당하는 default.target(적어도 CentOS에서는 심볼릭 링크이지만 런레벨에 해당하지 않음)를 사용해야 합니다 . multi-user.target올바른 구성은 다음과 같습니다.

[Install]
WantedBy=multi-user.target

시간을 내어 피드백을 보내주신 모든 분들께 감사드립니다!

답변3

시스템 서비스 파일은 활성화된 경우에만 읽혀지며 해당 순서와 종속성은 일반적으로 대상 또는 서비스의 필수 디렉터리 중 하나(일반적으로 사용자의 경우 /etc/systemd/system/)에 기호 링크를 포함하여 다이어그램에 연결됩니다. 생성된 서비스)). systemctl 활성화 작업은 서비스 파일의 [Install] 섹션에 나열된 링크에서 이러한 링크를 인스턴스화합니다.

답변4

시스템 장치를 수정한 후 서비스를 비활성화했다가 다시 활성화해야 했습니다.

# systemctl disable etcd
Removed /etc/systemd/system/multi_user.target.wants/etcd.service.


# systemctl enable etcd
Created symlink /etc/systemd/system/multi-user.target.wants/etcd.service → /etc/systemd/system/etcd.service.
## note the path changed 

관련 정보