*각* 프로세스가 시작될 때 PID를 터미널에 어떻게 인쇄할 수 있나요?

*각* 프로세스가 시작될 때 PID를 터미널에 어떻게 인쇄할 수 있나요?

내가 시작하면비동기식("백그라운드") 프로세스에서는 새 프로세스의 PID를 포함한 일부 정보가 프로세스가 실행되기 전에 터미널에 인쇄됩니다.

$ sleep 3 &
[1] 8217
$ 
[1]  + done       sleep 3
$ 

처음에 이런 정보(구체적으로 PID)를 출력할 수 있는 방법이 있나요?모든비동기적으로 시작된 프로세스뿐만 아니라 프로세스도 있습니까?


배경

이렇게 하고 싶은 이유는 일상 업무 설정의 특성으로 인해 다음과 같은 일이 자주 발생하기 때문입니다.동기화장기 실행 프로세스는 응답하지 않습니다 Ctrl-C. (항상 이러한 프로세스를 "장기 실행"으로 만드는 이유는 예상보다 훨씬 더 많은 출력을 생성한다는 것입니다.) 이러한 프로세스를 중지하는 가장 안정적인 방법은 kill -9다른 창에서 액세스하는 것이며 이를 위해 사용하는 것이 좋습니다. 목적에 따라 PID를 쉽게 사용할 수 있습니다.

업데이트: 원래 게시물에서는 이것이 Ctrl-Z옵션이 아니라는 점을 간과했습니다. (Emacs에서 실행되는 셸을 개발 중이므로 Ctrl-ZEmacs를 일시 중지하면 됩니다.)

답변1

~처럼스티븐 키트가 설명합니다., zsh가 PID를 인쇄하도록 하는 것은 매우 어려울 것입니다. 하지만 다른 방법으로도 정보를 얻을 수 있습니다.

Ctrl+를 눌러 Z프로세스를 일시 중지하면 zsh가 해당 PID를 표시합니다. 죽이고 싶다면 먼저 Ctrl+를 눌러 C직접 죽이세요. Ctrl+ C실패 하면 Ctrl+ \"더 엄격한" 종료를 시도합니다. ( Ctrl+ C일반적으로 프로그램에 현재 작업을 중지하고 사용자에게 제어권을 돌려주라고 지시하는 SIGINT를 보냅니다. Ctrl+ \일반적으로 프로그램이 심각하게 충돌하도록 지시하는 SIGQUIT를 보냅니다.) Emacs에서도 이 작업을 수행할 수 있습니다. 쉘 모드에서 C-c C-zpass C-zto Terminal, C-c C-cpass C-c, C-c C-\pass 를 누르십시오 C-\. Term 모드에서는 C-z합계가 C-\직접 전달되지만 C-c C-c단일 C-c.

프로세스가 터미널 설정을 변경했거나 신호를 차단한 경우 해당 프로세스를 찾아서 종료하는 편리한 방법은 터미널을 통하는 것입니다. 터미널이 무엇인지 알아보세요. tty터미널 내에서 명령을 사용하여 이를 수행할 수 있습니다. 이 부분을 프롬프트나 터미널 제목의 일부로 포함할 수 있습니다(저는 터미널 제목에 넣었습니다). Emacs는 터미널 제목을 표시하지 않지만 다음 표현식을 평가하여 정보에 액세스할 수 있도록 허용합니다.

(process-tty-name (get-buffer-process (current-buffer)))

셸 모드를 포함한 대부분의 모드에서 식을 평가하려면 M-:식을 입력한 다음 입력합니다. 용어 모드에서 식을 입력 C-c M-x eval-expression RET한 후 입력합니다. 이 기능을 자주 사용하는 경우 해당 모드의 키에 다음 명령을 바인딩하십시오.

(defun buffer-process-tty-name ()
  (interactive)
  (let ((tty (process-tty-name (get-buffer-process (current-buffer)))))
    (if (interactivep) (message "%s" tty))
    tty))

터미널 이름을 알고 나면 또는 를 사용하여 해당 터미널에 연결된 프로세스를 나열할 수 ps -t pts/42있습니다 pgrep -t pts/42.

답변2

이 정보를 기록하고 더 자세히 연구할 수 있는 방법이 없는 것 같아서 올바르게 설계하기가 어렵습니다(처음에는 이것도 구현하기 어려울 것이라고 생각했지만,이르카초이 문제를 해결했습니다).

구현 문제는 정보를 올바른 위치에 기록하는 것이라고 생각합니다. 쉘이 하위 프로세스를 시작할 때 하위 프로세스를 분기한 다음 실행합니다(자기 프로세스로 대체할 수 있는 경우는 제외). 이 경우 분기되지 않습니다. 분기되면 프로세스가 반복됩니다. 한 복사본은 fork()호출에서 반환 코드 0을 가져오며 이는 자식 프로세스임을 나타내고 다른 복사본은 자식 프로세스의 식별자를 가져오며 이는 부모 프로세스임을 나타냅니다. 하위 프로세스는 상위 프로세스의 파일 설명자를 상속하므로 이를 설정하기 전에 자신의 pid를 기록할 수 있습니다 exec().

디자인 문제는 무엇을 기록할지 선택하는 것입니다. 셸에서 시작된 모든 프로세스를 기록하면 관련 없는 로그가 많이 남게 됩니다.예를 들어건축 팁에 관련된 과정에 대해! "실제" 명령의 경우에도 파이프 및 기타 복합 명령에 대해 무엇을 기록할지 결정해야 합니다. 그리고 일관성을 위해 내장 명령이나 자식으로 쉘 대체 자체의 경우에 대해 일부 기록이 필요합니다. 수동으로 수행하지 않는 한 대화식 쉘에서는 이런 일이 발생하지 않습니다 exec.

이에 대해 더 자세히 알아보려면 addproc()및 및 printjobs()를 확인 하세요 .jobs.czexecve()exec.c

관련 정보