사용자 입력이 필요할 때 작업을 강제로 전면에 표시

사용자 입력이 필요할 때 작업을 강제로 전면에 표시

저는 현재 대규모 플랫폼에 대한 감사 스크립트를 작성 중입니다. 기본 스크립트에서는 트랩을 사용하고 트랩 중 하나에서는 사용자에게 파일을 정리하도록 요청합니다. 스크립트에는 표준 출력에 대한 출력이 없으므로 bg에서 스크립트를 실행하는 것이 분명합니다.

fgSIGQUIT를 bg-job으로 보내면 중지되며 프롬프트를 얻으 려면 수동으로 포그라운드로 가져와야 합니다 .

내가 시도한 것:set -m능동적인 직업 통제를 시도해보고 그것을 fg내 트랩 기능에 넣었습니다.

스크립트가 완료되면 쉘이 닫히고 스크립트 set -m가 없으면 스크립트에 작업 제어가 없다는 디버그 출력이 표시됩니다. 을 사용해도 set -m작업이 포그라운드로 나타나지 않습니다.

이를 위해 내 질문은 다음과 같습니다.

  • 특정 순간에 작업을 강제로 전면에 표시할 수 있나요?
  • 나는 이것이 스크립트에서 작업 제어를 사용하는 일반적인 방법이 아니라는 것을 알고 있습니다. 이에 대한 "모범 사례"는 무엇입니까?
  • 스크립트 내의 작업 제어는 서브셸/하위 프로세스에 대해서만 작동합니까, 아니면 이를 사용하여 시작하는 작업을 제어할 수 있습니까?

편집하다:screenlcd047이 제안한 것처럼 or 을 사용하는 것이 더 우아 tmux하고 스크립트를 깨끗하고 단순하게 유지합니다.

답변1

스크립트 내의 작업 제어는 서브셸/하위 프로세스에 대해서만 작동합니까, 아니면 이를 사용하여 시작하는 작업을 제어할 수 있습니까?

예. 작업 제어는 상위 셸에 의해 수행되므로 그 내부에서 하위 프로세스를 포그라운드로 가져올 수 없습니다.

편집하다:하지만 여전히 다음과 같이 할 수 있습니다.

  • 아래첨자:

    #! /bin/sh
    ...
    trap "kill -s USR1 $PPID" TTOU
    ...
    echo -n Cleanup?
    read yn </dev/tty
    ...
    
  • 상위 스크립트:

    #! /bin/sh
    ...
    trap "fg %1" USR1
    ...
    child &
    ...
    wait
    ...
    

그러면 SIGTTOU자식에 하나의 신호 처리기가 설치되고 SIGUSR1부모에 다른 신호 처리기가 설치됩니다. 하위 프로세스가 터미널에 무언가를 출력하려고 하면 를 수신 SIGTTOU한 다음 SIGUSR1상위로 전송하고 상위 프로세스가 실행되어 fg %1하위 프로세스를 전경으로 가져옵니다.

위의 내용은 %1자식 프로세스라고 가정합니다. 실제로 어쨌든 백그라운드에 프로세스가 있을 수 있습니다.

관련 정보