비동기 셸 명령


100

셸 스크립트를 사용하여 명령을 시작하려고합니다. 나는 그것이 끝나는 지 / 언제 / 어떻게 / 왜 완료되는지 상관하지 않습니다. 프로세스가 시작되고 실행되기를 원하지만 즉시 쉘로 돌아갈 수 있기를 원합니다.


2
관련 항목 은 Unix 및 Linux Stack Exchange에서 nohup, disown 및 &의 차이점을 참조하세요 .
jww

1
사이의 차이점에 대해 이야기하는 더 깊이있는 답을 찾는 분들을 위해 nohup, &그리고disown , 네 번째 대답을 스크롤하려면 여기를 클릭하세요 .
noɥʇʎԀʎzɐɹƆ

답변:


116

백그라운드에서 스크립트를 실행할 수 있습니다.

$ myscript &

이것은 &스크립트 내부에 넣는 것과는 다르므로 원하는 작업을 수행하지 못할 수 있습니다.


1
엄청나게 쉬운 일이 될 줄 알았는데 ... 리눅스는 내 일이 아니지만 속도를 높이려고 노력 중이 야 ...
LorenVS

2
&를 명령 줄에 넣는 것과 스크립트에 넣는 것의 차이점은 무엇입니까? 나는 그들이 다르다는 것을 몰랐다.
Jacob Sharf 2013

8
@JacobSharf, 한번 시도해 보시면 알게 될 것입니다. (가) 경우 &스크립트 안에 당신이없는 wait, 배경 명령을 할 때 스크립트 종료를 살해 될 것입니다.
Carl Norum

오. 그것은 많은 것을 설명합니다. 나는 최근에 그로 인해 발생할 수있는 어떤 영향을 발견했습니다. 인터넷 검색을하면 실제로이 페이지로 연결됩니다. 감사합니다
Jacob Sharf 2013-07-10

myscript터미널 환경을 변경하는 경우 예. 즉시 필요하지 않고 지연 될 수있는 터미널 초기화 명령인데, 여전히 터미널 환경을 수정합니까?
noɥʇʎԀʎzɐɹƆ

58

모두가 잊어 버렸습니다 disown. 그래서 다음은 요약입니다.

  • & 작업을 백그라운드에 둡니다.

    • 입력을 읽으려는 시도를 차단하고
    • 쉘이 완료 될 때까지 기다리지 않도록합니다.
  • disown 쉘의 작업 제어에서 프로세스를 제거하지만 여전히 터미널에 연결된 상태로 둡니다.

    • 결과 중 하나는 쉘이 a를 보내지 않는다는 것입니다 SIGHUP(쉘이를 받으면 프로세스에 SIGHUPa도 보내며 SIGHUP일반적으로 프로세스가 종료됩니다).
    • 그리고 분명히 백그라운드 작업에만 적용 할 수 있습니다 (포 그라운드 작업이 실행 중일 때는 입력 할 수 없기 때문입니다).
  • nohup단말에서 처리를 끊은 그 출력 리디렉션 nohup.out및 실드를 발 SIGHUP.

    • 이 프로세스는 전송 된 SIGHUP.
    • 작업 제어와 완전히 독립적이며 원칙적으로 포 그라운드 작업에도 사용할 수 있습니다 (그다지 유용하지는 않습니다).
    • 일반적으로 &(백그라운드 작업으로) 와 함께 사용됩니다 .

disown데비안이나 OS X에서 찾을 수 없습니다 . 프로그램이라고 생각했는데 착각 한 것 같습니다. 뭔데?
jww


6
이것이 최고의 답변입니다. 가장 포괄적입니다.
noɥʇʎԀʎzɐɹƆ

3
확실히 가장 좋은 대답은, 왜 그렇게 작은 업을 모른다
HeberLZ

1
@VladGanshin No.
Ani Menon

39
nohup cmd

단말기를 닫아도 끊지 않습니다. 기본적으로 출력은 nohup.out으로 이동합니다.

이것을 배경과 결합 할 수 있습니다.

nohup cmd &

출력을 제거하고

nohup cmd > /dev/null 2>&1 &

disown명령 도 가능 합니다. 입력 cmd, Ctrl-Z, bg,disown


2
모든 것이 결합되는 방식이 멋지고 미쳤습니다. 처음에는 순서가 나에게 전달 될 것이라고 생각하지만, 그냥 외울 수 있다고 생각합니다 (작성한 내용 또는 "nohup cmd &> / dev / null 2> & 1":))
LorenVS

나는 오늘 밤 이것을 우연히 만났다. 나는 이틀 동안 쉘 스크립트와 싸우고 있었고이 제안은 일을 시작했습니다. 감사합니다!
JD Long

아주 유용합니다. 백그라운드 모드에서 실행할 때를 사용하여 tail nohup.out가끔씩 명령 출력을 확인할 수 있습니다. 그러면 명령 출력의 마지막 10 줄이 표시됩니다. rsync 백업 작업에 이것을 사용하여 현재 어떤 파일에 있는지 확인합니다.
Martin Hansen

이 작업을 수행하지만 백그라운드 프로세스를 중지하려면 어떻게해야합니까?
Stephan Bijzitter

쉘은이 목적을 위해 정확하게 작업을 시작할 때 작업 식별자를 인쇄합니다. 을 사용하여 언제든지 실행중인 작업을 볼 수 있습니다 jobs.
tripleee

26

또는 프로그램을 실행 한 후 Ctrl-Z를 눌러 프로그램을 중지하고 다음을 입력 할 수 있습니다.

bg

마지막으로 중지 된 프로그램을 백그라운드에 둡니다. ( '&'없이 무언가를 시작했지만 다시 시작하지 않고 backgroung에서 원하는 경우 유용합니다)


2
감사합니다, 멋진 작은 트릭입니다 ... 셸의 장점 중 일부를 정말로 감사하기 시작합니다 ...
LorenVS

3

screen -m -d $command$분리 된 세션에서 명령을 시작합니다. screen -r시작된 세션에 연결하는 데 사용할 수 있습니다 . 원격 세션에도 매우 유용한 훌륭한 도구입니다. 에서 자세히 알아보십시오 man screen.


@LadenkovVladislav RedHat에 화면을 설치할 수 있다고 95 % 확신합니다. CentOS에 있습니다.
BuvinJ

우분투에서는 Windows / 배치 "시작"명령을 에뮬레이트하고 싶었습니다. 즉, 포 그라운드 (gui) 프로그램을 비동기 적으로 시작하고 쉘 스크립트를 계속 진행합니다. 이것은 정확히 그렇게합니다.
BuvinJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.