명령을 실행하는 동안 대기열에 넣기

명령을 실행하는 동안 대기열에 넣기

반환하는 데 시간이 걸리는 명령을 실행하고 그 후에 다른 명령을 실행하고 싶지만 미리 계획을 세울 수는 없다고 가정해 보겠습니다.

Ctrl + Z버튼을 누른 후 제출할 수 있는 옵션이 있다는 것을 알고 있습니다 fg && otherCommand. 그러나 여기에는 두 가지 주요 단점이 있습니다.

  1. command1 && command2command1; command2첫 번째 커밋 라인의 후속 명령은 실행되지 않기 때문에 첫 번째 명령이 다른 명령(또는 )의 조합인 경우 이 명령은 효과가 없습니다 .
  2. 다음 명령을 입력하면 첫 번째 명령의 실행이 중지됩니다. 이러한 귀찮은 30초 명령의 경우 다음 명령을 입력하는 데 소요되는 시간이 나머지 실행 시간의 전부는 아니더라도 큰 부분을 차지합니다.

Enter또한 하나를 실행하는 동안 다음 명령을 입력하고 제출을 클릭할 수 있다는 것도 알고 있습니다 . 그러나 여기에는 두 가지 주요 단점도 있습니다.

  1. 명령을 먼저 실행하면 작동하지 않습니다 stdin.
  2. 처음 실행한 명령이 출력을 생성하는 경우 입력한 내용이 표시되지 않습니다.

특수 터미널 에뮬레이터나 여러 터미널을 사용하여 하나를 실행하는 동안 더 많은 명령을 대기열에 추가하는 빠른 방법이 있습니까?

답변1

Ctrl+를 누르고 Z지금 실행하세요 bg. 이로 인해 현재 명령이 백그라운드에서 계속 실행됩니다. 그러면 현재 시간 이후에 fg && otherCommand일정을 사용할 수 있습니다.otherCommand

Ctrl이를 더 쉽게 하기 위해 빈 명령줄에서 +를 누르면 실행되도록 셸에서 +를 구성했습니다 . 바라보다Zbgzsh에서 포그라운드 프로세스를 더 빠르게 거부하려면 어떻게 해야 합니까?그리고명령줄 애플리케이션을 백그라운드로 직접 보내려면 어떻게 해야 합니까?;최신 버전의 bash가 동일한 작업을 쉽게 수행할 수 있는지 확인하지 않았습니다.

답변2

명명된 파이프를 생성할 수 있습니다(이 작업은 한 번만 수행해야 함).

mkfifo ~/myfifo

그런 다음 터미널(터미널 A라고 부르겠습니다)에서 다음과 같이 말할 수 있습니다.

exec 10< ~/myfifo

파이프의 읽기 끝을 파일 설명자 10에 할당하려면 2 이상의 다른 숫자를 사용할 수 있습니다. 따라서 다른 명령에 표준 입력, 출력 및 오류가 필요한 경우 표준 입력, 출력 및 오류를 계속 사용할 수 있습니다.

그런 다음 다른 터미널(터미널 B라고 부르겠습니다)에서 다음과 같이 말할 수 있습니다.

cat - > ~/myfifo

터미널 A 연결을 완료하고 프롬프트로 돌아갑니다. 이 명령은 표준 입력의 입력 내용을 파이프에 씁니다. 그런 다음 터미널 A에 다음을 입력할 수 있습니다.

while read -u10 -r LINE; do eval "$LINE"; done

그러면 터미널 B에 입력한 명령이 실행됩니다. 이 read명령은 파일 설명자 10에서 행을 읽고 eval. eval변수 내보내기와 같은 셸 명령을 실행할 수 있습니다.

터미널 A가 열려 있는 동안에는 Ctrl+C를 사용하여 명령을 다시 입력할 수 있도록 루프를 중단한 다음 루프를 다시 시작하여 대기 중인 나머지 명령 실행을 시작할 수 있습니다.

exec 및 while 명령을 쉘 스크립트에 넣을 수 있으므로 fg && yourscript처음에 잊어버린 경우 Ctrl-Z를 사용하여 파이프 모드를 활성화할 수 있습니다.

답변3

당신은 아마도 다음을 원할 것입니다:

wait $pid

동일한 셸에서 실행하지 않는 경우 내장 명령을 사용할 수 없으며 해결 방법이 필요합니다. 토론 보기여기.

답변4

편집하다:질문을 오해했지만 아래 기술은 bash 스크립트에서 명령을 실행할 때 사람들에게 여전히 유용할 수 있습니다(따라서 단일 PID를 갖습니다).

이것은 command1이 유용한 출력을 인쇄할 때 (Linux에서) 사용하는 것이며, 작업이 완료되면 다른 셸에서 다른 프로세스를 시작하려고 합니다(즉, command1을 배경으로 실행하고 싶지 않습니다).

tail --pid=$command1_pid -f /dev/null; command2

$command1_pid완료되기를 기다리는 프로세스의 PID는 어디에 있습니까?

(원래 여기에서 찾은 것 같습니다.https://stackoverflow.com/a/41613532/1676393. 유용한 추가 세부정보는 여기를 참조하세요. 예: Darwin용 버전(macOS))


단계별:

  • Ctrl+stop 명령 사용 1Z
  • run 을 실행한 ps다음 command1에 해당하는 프로세스를 찾고 해당 PID를 찾습니다.
  • 그런 다음 command1 프로세스를 다시 시작 fg하고 다음을 입력하여 새 셸에서 위 명령을 실행합니다.

이런 방식으로 command1이 이전 셸에서 완료되면 command2가 새 셸에서 시작됩니다.

관련 정보