내 프로젝트에서 snmp 관련 문제를 작업하는 동안 문제가 발생했습니다.
다음 명령어를 입력하고 다양한 옵션을 이용하여 snmpd를 실행하면 snmpd는 문제없이 실행된다.
$ sudo /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -p /run/snmpd.pid
그런데 systemctl 명령어로 snmpd를 실행시키기 위해 아래와 같은 서비스 파일을 생성하고 동작시켜 보았는데 실패했습니다.
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Type=notify
RuntimeDirectory=agentx
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
시간이 지남에 따라 실행 실패 이유를 찾아본 결과, systemctl 명령으로 snmpd를 실행하려면 -f 옵션을 주어야 한다는 결론에 이르렀습니다.
[Unit]
Description=Simple Network Management Protocol (SNMP) Daemon.
After=network.target
ConditionPathExists=/etc/snmp/snmpd.conf
[Service]
Type=notify
RuntimeDirectory=agentx
ExecStart=
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid -f
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -p /run/snmpd.pid -f
이 -f 옵션의 기능을 확인하기 위해 매뉴얼 페이지를 열었습니다.
매뉴얼 페이지에는 -f 옵션의 기능이 설명되어 있습니다.
-f Do not fork() from the calling shell.
내가 포크에 대해 아는 것은 프로세스가 스스로 복제하는 행위입니다.
그래서?
systemctl을 사용하여 snmpd를 실행하는 것과 snmpd를 직접 실행하는 것의 차이점을 아직도 이해하지 못합니다.
나는 systemctl의 ExecStart가 드라이버 명령(스크립트)을 선언한다는 것을 알고 있습니다.
ExecStart에 실행 파일을 선언하는 것과 직접 실행하는 것의 차이점은 무엇입니까?
누구든지 나를 도와줄 수 있나요?
답변1
가장 분명한 차이점은 서비스가 systemd에서 활성화되면 재부팅 시와 같이 호스트의 다른 서비스와 함께 자동으로 시작(및 중지)된다는 것입니다. 유닛 파일에 정의할 수 있는 다른 동작이 있습니다. 서비스를 시작하기 전에 구성 파일을 확인하고 네트워크 인터페이스가 작동하는지 확인하는 항목이 이미 있지만 다른 일반적인 동작은 다음과 같습니다.
- 충돌이 발생하면 서비스를 다시 시작하세요.
- 데몬이 읽거나 쓸 수 있는 디렉터리에 마스크를 적용합니다.
- STDOUT 및/또는 STDERR을 캡처하여 (예를 들어) syslog로 리디렉션합니다.
- 서비스가 중지되면 일부 정리 작업 적용
각 데몬에는 고유한 명령줄 옵션 세트가 있습니다. 런타임 동작(다시 로드)을 변경하는 다양한 메커니즘이 있습니다. SysV init, systemd, upstart, runit, openrc 등 init 시스템은 서비스 시작, 중지, 쿼리 및 다시 로드를 위한 일관된 사용자 인터페이스를 제공합니다.