![시스템 종료 코드 EXIT_FDS는 무엇을 의미합니까?](https://linux55.com/image/207139/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EC%A2%85%EB%A3%8C%20%EC%BD%94%EB%93%9C%20EXIT_FDS%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9D%84%20%EC%9D%98%EB%AF%B8%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
systemd status
서비스를 중지한 후 다음 메시지를 받았습니다.
Actice: failed (Result: exit-code) <...> Main PID: 4747 (code=exited, status=202/FDS)
상태 FDS는 다음과 같이 정의됩니다.문서이와 같이:
202 EXIT_FDS 원치 않는 파일 설명자를 닫거나 전달된 파일 설명자를 조정할 수 없습니다.
서비스 시작이 제대로 작동하고 오류가 보고되지 않습니다.systemd status
질문
- EXIT_FDS는 보다 실제적으로 무엇을 의미합니까?
- 상태 코드는 내 애플리케이션에서 나오나요, 아니면 시스템 자체에서 나오나요?
- 내 응용 프로그램이 중지되면 닫히지 않는 TCP 소켓을 엽니다. 이것이 이유입니까?
- 그렇다면 systemd가 지연된 소켓을 오류로 보고하지 않고 무시하도록 할 수 있습니까?
세부 사항
전체 상태 메시지:
tool-user@tool-box:~$ systemctl status tool.service
● tool.service - Tool application
Loaded: loaded (/home/tool-user/tool.service; linked; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2022-02-07 14:14:46 CET; 3s ago
Process: 4758 ExecStop=/bin/bash -c tool-stop && while ps -p $MAINPID >/dev/null
Process: 4601 ExecStart=/bin/bash -c tool-start (code=exited, status=0/SUCCESS)
Main PID: 4747 (code=exited, status=202/FDS)
Feb 07 14:14:31 tool-box systemd[1]: Starting Tool application...
Feb 07 14:14:32 tool-box bash[4601]: Server started on port 44680
Feb 07 14:14:32 tool-box systemd[1]: Started Tool application.
Feb 07 14:14:44 tool-box systemd[1]: Stopping Tool application...
Feb 07 14:14:45 tool-box systemd[1]: tool.service: Main process exited, code=exited, status=202/FDS
Feb 07 14:14:46 tool-box systemd[1]: tool.service: Failed with result 'exit-code'.
Feb 07 14:14:46 tool-box systemd[1]: Stopped Tool application.
서비스 정의 파일은 다음과 같습니다.
[Unit]
Description=Tool application
# Standard dependencies for web server
After=network.target remote-fs.target nss-lookup.target httpd-init.service
[Service]
Type=forking
Restart=on-failure
RestartSec=10
ExecStart=/bin/bash -c 'toolStart'
ExecStop=/bin/bash -c 'toolStop && while ps -p $MAINPID >/dev/null 2>&1; do sleep 1; done'
User=tool-user
StandardOutput=syslog
StandardError=syslog
TimeoutStopSec=60
[Install]
WantedBy=multi-user.target
운영 체제: Windows 10의 VirtualBox에서 실행되는 Ubuntu 18.04 Server.
tool-user@tool-box:~$ uname -a
Linux tool-box 4.15.0-166-generic #174-Ubuntu SMP Wed Dec 8 19:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
답변1
서비스의 Type=forking
PID 는 ExecStart
4758이고 문의하신 종료 코드는 기본 PID 4747로 나열되어 있으므로 하위 프로세스를 systemd
관리하여 ExecStart 프로세스를 성공적으로 실행했다는 결론을 내릴 수 있으므로 시스템 테이블 - 특정 종료 코드는 다음과 같습니다. 여기에는 적용되지 않습니다.fork()
execve()
systemd
오류가 fork()
다음 이후의 실제 하위 프로세스에서 발생하는 경우, 이전에는 시스템별 종료 코드 테이블이 적용됩니다. 특히 오류 202는 execve()
서비스 정의 의 구현 StandardInput=
또는 지시문에 문제가 있음을 의미합니다 StandardOutput=
. StandardError=
그러나 ExecStart
특정 보고서는 PID 4601이고 종료되므로 status=0/SUCCESS
여기서는 그런 일이 발생하지 않습니다. PID 4758로 실행 되었으므로 ExecStop
그 중 하나도 나오지 않습니다.
상태 코드 202는 응용 프로그램의 "주 프로세스"(PID 4747이 있는 프로세스)에서 나오며 그 의미는 응용 프로그램 개발자가 의도한 것과 아무 관련이 없습니다.
남은 TCP 소켓은 원인이 아닙니다. 애플리케이션 프로세스가 종료되었으므로 커널은 남아 있는 소켓을 모두 정리합니다.
물론, 애플리케이션이 SO_REUSEADDR 소켓 옵션을 사용하지 않는다면, 그렇지 않을 수도 있습니다.지금 다시 시작애플리케이션을 실행하고 지연된 소켓의 TIME_WAIT가 만료될 때까지 동일한 포트 번호를 사용하도록 합니다. 하지만 이는 시스템 문제가 아니며 애플리케이션이 자체적으로 처리해야 하는 문제입니다.
이 /FDS
부분은 다음에서 비롯됩니다.exit_status_to_string()
shared/exit-status.c
함수는 systemd 소스 패키지의 파일에 있습니다 .
상태 코드에 표준화된 의미가 있는 경우 함수는 상태 코드의 의미를 설명하는 간단한 힌트를 추가해야 합니다. 함수는 사용할 상태 코드 힌트 세트를 결정하기 위해 매개 변수를 사용할 수 있지만 systemctl status
함수를 언제 사용해야 하는지(예: 파일에서)systemctl/systemctl-show.c
EXIT_STATUS_LIBC | EXIT_STATUS_SYSTEMD
, (이 글을 쓰는 시점에서) 상태 코드가 실제로 시스템화된 프로세스에서 나오는지 여부를 확인하지 않고 "libc 및 systemd 자체의 사용을 기반으로 상태 코드 힌트를 표시"하도록 설정된 인수를 사용하여 호출하는 것 같습니다. 모음곡.
최종 결과는 상태 202가 /FDS
있는지 여부에 관계없이 항상 상태 202에 연결된다는 것입니다.체계적인 특정 의미 "원치 않는 파일 설명자를 닫을 수 없거나 전달된 파일 설명자를 조정할 수 없습니다"아니면. 이것은 단순한 테이블 조회일 뿐입니다. 더 이상 지능이 있다고 생각하지 마십시오.
(Unix 프로그래밍 문헌 및 프로그래머 전문 용어에서 "fds"는 "파일 설명자"라는 용어의 일반적인 약어입니다. 또한 /FDS
systemd 코드에서 상태 코드 202에 대한 기호 이름을 의미합니다. EXIT_FDS
- 모든 systemd의 상태 코드 기호는 접두사이므로 EXIT_
제거됩니다. 간결함을 위해).