컴퓨터가 부팅될 때 무선 액세스 포인트를 시작하기 위해 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