UNIX 시스템의 다른 프로세스에서 파일 디스크립터를 닫는 방법
-
11-07-2019 - |
문제
명령을 사용할 수 있습니다 LSOF 실행중인 모든 프로세스에 대한 파일 설명자를 얻는 것은 해당 프로세스 내부에 있지 않고 해당 설명 자 중 일부를 폐쇄하는 것입니다. 이 작업은 Windows에서 수행 할 수 있으므로 일부 응용 프로그램을 쉽게 차단 해제 할 수 있습니다.
그것에 대한 명령이나 기능이 있습니까?
해결책
Windows에서는 누군가가 장치 드라이버를 실행중인 커널에 삽입하는 프로그램을 작성하여 프로그램을 사용하여이를 수행 할 수 있습니다. 그건 그렇고, 깨진 응용 프로그램이 사용중인 손잡이를 닫은 후에는 응용 프로그램이 핸들이 닫혀 있음을 알지 못하고 응용 프로그램이 다른 관련없는 객체를 열면 알 수 없기 때문에이 작업을 수행하는 것이 위험 할 수 있습니다. 동일한 핸들이 이제 다른 관련이없는 객체를 참조 할 수 있습니다. 가능한 빨리 깨진 응용 프로그램을 죽이고 싶습니다.
리눅스에서는 반드시 동일한 종류의 기술을 사용할 수 있습니다. 모듈을 실행중인 커널에 삽입하는 프로그램을 작성하십시오. 모듈과 통신하고 어떤 손잡이를 닫을 지 알 수 있습니다. 그렇게하는 것은 똑같이 위험 할 것입니다.
다른 팁
왜이 작업을 수행하려고하는지 모르겠지만 GDB를 사용하여 프로세스에 첨부 한 다음 FD에서 Close ()를 호출 할 수 있어야합니다. 예시:
하나의 껍질에서 : 고양이
다른 껍질에서 :
$pidof cat
7213
$gdb -p 7213
...
lots of output
...
(gdb)
이제 GDB에 닫기 (0)를 실행하도록 지시합니다.
(gdb) p close(0)
$1 = 0
(gdb) c
Continuing.
Program exited with code 01.
(gdb)
첫 번째 쉘에서 나는이 출력을 얻는다 :
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
나는 그렇게 생각하지 않지만 LSOF는 당신에게 파일을 열었던 프로세스의 PID를 제공하므로, 당신이 할 수있는 일은 프로세스를 완전히 죽이거나 최소한 신호를 보내도록 신호를 보내는 것입니다.
나는 그것을 의심한다. 파일 설명자는 프로세스 로컬이며 stdout
모든 프로세스에 1이지만 여전히 고유 한 스트림을 참조합니다.
아마도 당신이 해결하려는 차단 문제에 대해 더 자세한 내용은 유용 할 것입니다.
Windows보다 Unix 에서이 작업을 수행 할 필요가 훨씬 적습니다.
Windows에서 대부분의 프로그램은 열린 파일을 "잠금"(실제로 공유 거부)하는 경향이 있으므로 다른 프로그램에서 읽거나 서면/삭제할 수 없습니다.
유닉스에서는 대부분 이런 일이 일어나지 않습니다. UNIX에서 파일 잠금은 대부분 권고 사항이며 일반 읽기/쓰기/삭제 작업이 아닌 다른 잠금 시도 만 차단합니다. 프로세스의 현재 디렉토리를 제거 할 수도 있습니다.
유일한 상황에 대해 이것은 UNIX에서 정상적인 사용으로 나타나는 것입니다. 파일 시스템을 umpount하려고 할 때 (장착 된 파일 시스템에 대한 참조는 umount를 차단할 수 있음)입니다.