특정 프로세스가 장기 실행 백그라운드 프로세스 A라고 가정합니다. 프로세스 A가 시작되자마자 pid를 가져와서 작업을 수행하는 등 bash 스크립트 명령/스크립트 후크를 실행하고 싶습니다. 내 사용 사례의 문제점은 프로세스 A가 시작되는 시기/방법을 제어할 수 없으며 프로세스 A를 변경하여 pidfile을 생성할 수 없다는 것입니다.
현재 프로세스 A는 여러 번 실행될 수 있으므로 프로세스 A와 연결된 여러 PID가 있을 수 있습니다. 스크립트 후크는 처음뿐만 아니라 프로세스 A의 모든 인스턴스에서 실행되어야 합니다.
프로세스 A의 모든 인스턴스를 가져오기 위해 cron과 pgrep을 사용해 보았습니다. 그러나 이 방법은 cron의 최소 폴링 간격이므로 60초의 지연이 있습니다.
내 질문:
- 새 프로세스 A가 시작되고 프로세스 A의 bash 후크가 안정적으로 실행될 때마다 거의 실시간 알림(5초 미만의 지연이 허용되며 낮을수록 좋음)을 달성하려면 어떤 옵션이 있어야 합니까?
- 낮은 대기 시간(예: 1~5초 절전)으로 bg에서 무한 while 루프 + pgrep을 실행하는 것이 안전한 옵션입니까?
- inotify가 파일 이벤트에 존재하므로 특정 프로세스 이벤트(예: 시작/종료/proc 상태 변경)를 수신(+ cmd 후크 실행)하는 유사한 메커니즘이 있습니까?
감사해요!
답변1
신뢰할 수 있는 유일한 해결책은 래퍼 스크립트를 통해 프로그램을 실행하도록 준비하는 것입니다. 이를 수행하는 방법에는 여러 가지가 있지만 그 중 어느 것도 작동하지 않는 것은 드문 일입니다.
- 래퍼를 실행하기 위해 이 프로그램을 호출하는 프로그램을 구성하거나 수정합니다.
- 에 같은 이름의 래퍼를 배치합니다
$PATH
. - 프로그램 이름을 바꾸고 래퍼에 원래 이름을 지정합니다.
이 접근 방식을 사용하면 래퍼가 실행되고 필요한 경우 실제 프로그램을 실행하기 전에 준비할 수 있는 기회가 보장됩니다. 래퍼는 또한 실제 프로그램의 상위 프로세스가 될 수 있으며, 이를 통해 프로그램이 종료될 때 안정적으로 알림을 받고 종료 상태를 얻을 수 있습니다.
당신은 그것을 사용할 수 있습니다로깅 파일 시스템파일 시스템의 이벤트를 모니터링합니다. 바라보다LoggedFS 구성 파일 구문구성 파일에 대한 문서입니다. loggedfs
실행 파일이 포함된 디렉터리를 가리킵니다 . 이를 가지고 있거나 Loggedfs를 루트로 실행해야 합니다. 파일이 실행될 때마다 open
이벤트가 발생하며 해당 프로세스의 PID를 얻을 수 있습니다. open
파일을 읽기 위해 열면 이벤트도 발생합니다. LoggedFS만 사용하면 실행 이벤트를 구분할 수 없을 것 같습니다 . 프로세스가 종료되면 release
이벤트가 생성됩니다. 모니터링 코드가 실행되는 동안 프로세스가 종료될 수 있습니다.
Linux에서는 다음을 사용할 수 있습니다.inotify기다려실행 파일에서 또는 이벤트를 기다립니다 access
. 파일이 실행될 때마다 이벤트가 발생하고 프로세스가 종료될 때 이벤트가 발생합니다. 이 방법으로는 프로세스 ID를 얻을 수 없으므로 파일이 열려 있는 프로세스(예: 또는 사용)를 찾은 다음 파일을 실행하는 프로세스를 필터링해야 합니다.close_nowrite
inotifywait -m -e access,close_nowrite --format=%e /bin/ls
access
close_nowrite
fuser
lsof
Linux에는 이벤트(예: 특정 파일 실행)를 모니터링하고 이벤트를 발생시킨 PID를 보고할 수 있는 보다 정확한 도구인 감사 하위 시스템도 있습니다. 바라보다명령줄 인수를 포함하여 실행된 모든 명령을 기록하는 쉬운 방법이 있습니까?. 그런 다음 사용할 수 있습니다아우디 SPD감사 이벤트가 발생하면 사용자 정의 프로그램을 실행합니다. 그러나 이들 모두에는 루트 액세스가 필요하며 루트인 경우 실행 파일을 대체할 수 있지만 이것이 필요하지 않습니다.