백그라운드에서 자동으로 작업 시작

백그라운드에서 자동으로 작업 시작

다음과 같이 프로세스가 백그라운드에 배치되고 완료될 때 알림을 받지 않고 백그라운드에서 프로세스를 시작하는 데 이를 사용할 수 있다는 것을 알고 있습니다.

(명령 &) &> /dev/null

그러나 이렇게 하면 프로세스가 완료될 때 캡처된 옵션이 제거됩니다( trap child_done CHLD).

어떻게 둘 다 가질 수 있나요?

답변1

작업 스풀러당신에게 도움이 될 수도 있습니다.

에서와 같이신선한 고기 네트워크:

작업 스풀러는 스풀링된 작업이 차례로 실행되는 Unix 배치 시스템입니다. 언제든지 실행할 작업의 양을 설정할 수 있습니다. 각 시스템의 각 사용자는 고유한 작업 대기열을 가지고 있습니다. 이러한 작업은 모든 셸/프로세스의 올바른 컨텍스트(인큐 컨텍스트)에서 실행되며 해당 출력/결과를 쉽게 볼 수 있습니다. 명령이 많은 RAM에 의존하고, 많은 디스크를 사용하고, 많은 출력을 제공하거나, 어떤 이유로 모든 명령을 동시에 실행하지 않고 유지하려는 경우 유용합니다. 귀하의 리소스는 최대 효율성을 달성하기 위해 바쁘게 움직이고 있습니다. 인터페이스를 통해 스크립트에서 쉽게 사용할 수 있습니다.

작업 스풀러를 사용하여 다음 작업을 수행할 수 있습니다.더반, 우분투 및 기타 배포판.

이를 통해 작업 대기열을 실행하고 필요에 따라 해당 출력에 액세스할 수 있습니다.

예를 들어:

$ tsp sleep 5
0 
$ tsp sleep 5 
1
$ tsp
ID   State      Output               E-Level  Times(r/u/s)   Command [run=1/1]
2    running    /tmp/ts-out.ZWn6Le                           sleep 5
1    finished   /tmp/ts-out.Fhlcle   0        5.00/0.00/0.01 sleep 5

백그라운드에서 많은 작업을 실행하는 경우 확실히 도움이 될 것입니다.

순차적으로 실행하거나 미리 설정된 슬롯 수에서 실행할 수 있습니다. 작업 간에 종속성을 생성할 수도 있습니다(실행작업 1~하지 않는 한작업 0성공적으로 완료되었습니다.)

답변2

두 가지 모두에서 수행하는 방법은 다음과 같습니다 {ba,z}sh.

함수를 사용하면 변수를 사용하지 않고도 변수의 상태를 저장하고 복원하는 데 도움이 됩니다 zsh.monitorsetopt local_options

# Run the command given by "$@" in the background
silent_background() {
  if [[ -n $ZSH_VERSION ]]; then  # zsh:  https://superuser.com/a/1285272/365890
    setopt local_options no_notify no_monitor
    "$@" &
  elif [[ -n $BASH_VERSION ]]; then  # bash: https://stackoverflow.com/a/27340076/5353461
    { 2>&3 "$@"& } 3>&2 2>/dev/null
  else  # Unknownness - just background it
    "$@" &
  fi
}

사용 방법:

trap 'echo child done' CHLD
silent_background sleep 1

예상되는 메시지가 생성됩니다 child done.

답변3

알림이 전송되었으므로 명령 출력의 리디렉션은 중요하지 않은 것 같습니다.쉘을 통해언제일하다비동기식으로 시작됩니다. 보다 정확하게는 관련된 쉘 함수(function)이다.직업 통제.

이 인용문은 "Bash 참조 매뉴얼", "작업 제어" 장, 섹션 1에서 나온 것입니다.

셸은 작업을 각 파이프라인과 연결합니다. 이는 jobs명령을 사용하여 나열 할 수 있는 현재 실행 중인 작업 테이블을 보유합니다 . Bash가 작업을 비동기적으로 시작하면 다음과 같은 줄이 인쇄됩니다.

[1] 25647

작업의 작업 번호는 1이고 해당 작업과 연결된 파이프라인의 마지막 프로세스의 프로세스 ID는 25647임을 나타냅니다. 단일 파이프라인의 모든 프로세스는 동일한 작업의 구성원입니다. Bash는 작업 제어의 기초로 JOB 추상화를 사용합니다.

쉘 스크립트는 이 알림을 표시하지 않습니다.

$ cat test
#!/bin/bash

true & echo true
$ ./test
true

사실에 따르면

지쉬

Zsh 문서는 이러한 알림에 대한 유사한 지침을 제공합니다. man 1 zshmisc"JOBS" 섹션을 참조하세요. 다음과 같은 경우에는 알림이 표시되지 않습니다.직업 통제장애가 있는.

감시 장치(-중, 크쉬:-중)

    작업 제어를 허용합니다. 대화형 쉘의 기본값입니다.

zsh_prompt % setopt no_monitor
zsh_prompt % true & echo true
true
zsh_prompt %
zsh_prompt % 

불다

Bash는 항상 예를 ​​들어 표시되는 것 같습니다 [1] 25647. 예를 들어, 다음과 같은 경우 최종 통지가 [1]+ Done true표시되지 않습니다.직업 통제장애가 있는.

bash_prompt $ true & echo true
[1] 25647
true
bash_prompt $ 
[1]+  Done                    true

작업 제어가 비활성화되었습니다.

bash_prompt $ set +m       # disable job control
bash_prompt $ true & echo true
[1] 25685
bash_prompt $
bash_prompt $

결론적으로

비활성화되어 있는지는 알 수 없습니다.직업 통제알림을 숨기는 것이 좋은가요?

자원

답변4

다음 예를 참조하세요.

trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait

좋은 결과. 필요하지 않음 ( ): 원치 않는 하위 쉘이 생성됩니다. { }그룹 명령만 하면 됩니다.

관련 정보