StackOverflow에 훌륭한 답변이 있습니다.데몬에 대해 더 나은 잠금 제공(에서 합성에두아르도 플뢰리)는 데몬 프로세스에 의존하지 않는 범용 PID 파일 잠금 메커니즘입니다. PID 잠금 파일이 때때로 문제를 일으키는 이유에 대한 좋은 의견이 많이 있으므로 여기서는 반복하지 않겠습니다.
즉, 솔루션은 데몬이 SIGKILL된 후에도 지속되는 파일에 의존하는 대신 이름으로 소켓을 추적하는 Linux 추상 네임스페이스 도메인 소켓에 의존합니다. 이 예에서는 프로세스가 종료되면 Linux가 소켓을 해제하는 것처럼 보입니다.
그러나 바인딩 프로세스가 SIGKILL로 표시된 경우 Linux가 추상 소켓을 사용하여 정확히 무엇을 하는지 설명하는 명확한 문서를 Linux에서 찾을 수 없습니다. 아는 사람 있나요?
즉, 추상 소켓이 다시 사용하기 위해 정확히 언제 릴리스됩니까?
문제가 완전히 해결되지 않는 한 PID 파일 메커니즘을 추상 소켓으로 교체하고 싶지 않습니다.
답변1
나는 이 질문을 1년 전에 게시했는데 명확한 문서가 부족하여 불만스러웠습니다. 업데이트가 있는지 Linux 문서를 다시 확인해야겠다고 생각했는데, 이제 가도 좋습니다.이것 좀 봐:
추상 소켓
소켓 권한은 추상 소켓에 대해 의미가 없습니다. 프로세스 umask(2)는 추상 소켓을 바인딩할 때 아무런 영향을 미치지 않으며 객체의 소유권 및 권한 변경(fchown(2) 및 fchmod(2)을 통해)은 추상 소켓에 영향을 미치지 않습니다. 효과. 소켓 접근성.
소켓에 대한 모든 열린 참조가 닫히면 추상 소켓이 자동으로 사라집니다.
반품,리눅스 프로그래밍 인터페이스통과마이클 크릭다루는 문제(교차 게시됨)이 다른 답변):
57.6 리눅스 추상 소켓 네임스페이스
소위 추상 네임스페이스는 파일 시스템에 이름을 생성하지 않고도 UNIX 도메인 소켓을 이름에 바인딩할 수 있는 Linux 특정 기능입니다. 이는 몇 가지 잠재적인 이점을 제공합니다.
- 파일 시스템에 있는 기존 이름과의 충돌 가능성에 대해 걱정할 필요가 없습니다.
- 사용이 끝나면 소켓 경로 이름을 연결 해제할 필요가 없습니다. 소켓이 닫히면 추상 이름이 자동으로 제거됩니다.
- 소켓에 대한 파일 시스템 경로 이름을 만들 필요가 없습니다. 이는 chroot 환경이나 파일 시스템에 대한 쓰기 권한이 없는 경우 유용할 수 있습니다.
추상 바인딩을 생성하려면 첫 번째 바이트를 지정합니다. 태양 경로필드가 널 바이트(\0)입니다. [...]
@ user3188445의 답변과 함께 이것이 질문을 매우 정확하게 설명한다고 생각합니다.
즉, SIGKILL 프로세스가 열려 있는 모든 소켓을 닫는다는 가정이 여전히 존재합니다. 이는 합리적인 가정처럼 보이지만 이 동작을 정의하는 문서가 없습니다.
답변2
예, Linux는 합당한 지점까지 추상 소켓을 자동으로 "정리"합니다. 다음은 이를 확인하는 데 사용할 수 있는 최소한의 실제 예제입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
int
main(int argc, char **argv)
{
int s;
struct sockaddr_un sun;
if (argc != 2 || strlen(argv[1]) + 1 > sizeof(sun.sun_path)) {
fprintf(stderr, "usage: %s abstract-path\n", argv[0]);
exit(1);
}
s = socket(AF_UNIX, SOCK_STREAM, 0);
if (s < 0) {
perror("socket");
exit(1);
}
memset(&sun, 0, sizeof(sun));
sun.sun_family = AF_UNIX;
strcpy(sun.sun_path + 1, argv[1]);
if (bind(s, (struct sockaddr *) &sun, sizeof(sun))) {
perror("bind");
exit(1);
}
pause();
}
프로그램을 실행 ./a.out /test-socket &
하면 ss -ax | grep test-socket
사용 중인 소켓을 볼 수 있습니다. 그런 다음 kill %./a.out
, 및 는 ss -ax
소켓이 사라졌음을 표시합니다.
그러나 어떤 문서에서도 이 정리를 찾을 수 없는 이유는 실제로 비추상 Unix 도메인 소켓을 정리해야 하는 방식의 정리가 아니기 때문입니다. 비추상 소켓은 실제로 inode를 할당하고 디렉토리에 항목을 생성합니다. 이 항목은 기본 파일 시스템에서 정리되어야 합니다. 대조적으로, 추상 소켓은 TCP 또는 UDP 포트 번호와 더 유사합니다. 물론 TCP 포트를 바인딩한 후 종료하면 TCP 포트가 다시 해제됩니다. 그러나 무엇을 사용하든 16비트 숫자는 여전히 추상적으로 존재하며 항상 존재합니다. 포트 번호의 네임스페이스는 1-65535이며 변경되거나 정리가 필요하지 않습니다.
따라서 추상 소켓 이름을 TCP 또는 UDP 포트 번호로 생각하면 됩니다. 이는 경로 이름처럼 보이지만 그렇지 않은 더 큰 가능한 포트 번호 세트에서 선택되었습니다. 동일한 포트 번호를 두 번 바인딩할 수 없습니다(금지됨 SO_REUSEADDR
또는 SO_REUSEPORT
). 그러나 소켓을 닫으면(명시적으로 또는 종료를 통해 암시적으로) 아무것도 정리하지 않고 포트가 해제됩니다.