SIGUSR1 신호를 받을 때 진행 상황을 출력하기 위해 이 함수를 사용하는 쉘 스크립트를 작성했지만 trap
, 신호를 보낸 프로세스의 STDOUT에 진행 상황을 출력하는 스크립트를 얻는 방법을 모르겠습니다. 따라서 스크립트가 터미널 에뮬레이터에서 실행되고 /dev/pts/10
터미널 에뮬레이터에서 프로세스로 신호를 보내는 경우 출력은 내가 원하는 대로 /dev/pts/11
전송됩니다 . 하드코딩된 셸 리디렉션을 통해 특정 STDOUT에 진행 메시지를 보내고 싶지 않습니다 ./dev/pts/10
/dev/pts/11
wall
답변1
당신이 원하는 것은 불가능합니다. 프로세스는 어떤 프로세스가 자신에게 신호를 보냈는지 확인할 수 없습니다. 여러 프로세스가 충분히 짧은 시간 내에 동일한 프로세스에 동일한 신호를 보내는 경우 수신자는 하나의 신호만 보게 됩니다.
어떤 프로세스가 신호를 보냈는지 알더라도 보낸 사람의 표준 출력에 쓸 수 있는 권한이 없을 수도 있습니다.
원하는 작업을 수행하는 합리적인 방법은 프로세스가 Unix 소켓에서 수신 대기하도록 하는 것입니다. 소켓에 연결이 있으면 진행 정보가 소켓에 기록됩니다. 다른 쪽 끝에서 원하는 위치에 인쇄하도록 하세요.
상태를 쿼리하려면 다음을 사용할 수 있습니다.socket
일부 배포판의 유틸리티 또는 더 강력하지만 복잡한 유틸리티socat
.
socket -r ./my-program-status # If the socket is a filesystem domain socket in the current directory
socat UNIX-CLIENT:my-program-status - # If the socket is a filesystem domain socket in the current directory
socat ABSTRACT-CLIENT:my-program-status - # If the socket is an abstract domain socket in the current directory
서버 측 개념 증명:
while date | socket -q -s ./status; do echo .; done
또 다른 접근 방식은 프로그램이 주기적으로 상태를 파일에 기록하도록 하는 것입니다.