왜 '&'로 Linux 쉘 명령을 실행합니까?


30

Red Hat Linux Enterprise 버전 5를 사용하고 &있습니다. 사람들이 때때로 몇 가지 옵션으로 명령을 실행하는 것을 보았습니다 . 예를 들어 아래 명령에는 두 개의 &부호가 있습니다. 그들의 목적은 무엇입니까? 그들은 항상 nohup과 함께 사용됩니까?

nohup foo.sh <script parameters> >& <log_file_name> &

답변:


15

Martin 's, Ash 및 Kevin의 답변 외에도 때로는 앰퍼샌드가 수학적으로 비트 단위 AND *로 사용되는 것을 볼 수 있습니다 .

$ echo $(( 11 & 7 ))
3

비트 연산자에 익숙하지 않은 경우 :

11: 1011
 7: 0111
-------- AND
 3: 0011

각 위치에는 첫 번째 숫자와 두 번째 숫자에 1 비트가 있으며 답에서 해당 비트를 1로 설정하십시오.

* Kevin의 답변에서이 기능을 논리 AND 라고합니다 .

Ash의 답변을 자세히 설명하기 위해 리디렉션에서 사용될 때 앰퍼샌드는 셸에 파일 설명자를 복사하도록 지시 할 수 있습니다. 이 명령 echo "hello" > outputfile 2>&1에서 앰퍼샌드는 표준 오류 (stderr, 파일 설명자 2)로 갈 수있는 모든 출력이 표준 출력 (stdout, 파일 설명자 1, 왼쪽의 기본값)과 같은 위치로 이동합니다 >. >& outputfile연산자에 대한 속기 > outputfile 2>&1.

또한 Bash 4의 새로운 기능으로, case명령 에 절에 대한 두 개의 새로운 종결자가 있으며 ;&, ;;&이는 사례가 "통과"하는지 여부에 영향을 미치며, 그렇다면 다음 테스트 수행 여부에 영향을줍니다.


쿨, 데니스! ssh 터미널 로그를 시스템에 사용하고 ssh 터미널을 사용하여 명령을 실행하고 (장기 프로세스 제공) 터미널 세션을 종료하면 명령의 장기 프로세스가 올바르게 종료됩니다. 그리고 쉘을 종료해도 명령이 계속 실행되도록하려면 nohup 또는 & (명령 끝에서)를 사용하거나 nohup과 &를 모두 사용해야합니까?
George2

1
@ George2 : 아니요, >& filenamestdout과 stderr을 모두 같은 파일로 출력합니다. stderr 만 리디렉션하고 stdout을 그대로 두려면을 수행하십시오 2> filename. 다른 질문에 관해서는, 가장 가능성이 당신은 둘 다 사용하는 것 nohup등을 &.
추후 공지가있을 때까지 일시 중지되었습니다.

1
@ George2 : 명령을 백그라운드로하지 않으면 쉘 프롬프트가 표시되지 않으므로 logout또는 exit명령을 실행할 수 있습니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

2
George : &를 사용하지 않으면 다른 작업을 수행하라는 메시지가 다시 표시되지 않습니다. 프로세스가 종료되거나 종료 / 종료 될 때까지 터미널이 "중단"됩니다. &는 프로세스가 백그라운드에서 실행되도록 보장합니다. 그러나 로그 오프하면 운영 체제가 모든 프로세스를 종료하므로 백그라운드 프로세스도 종료됩니다. nohup 을 사용 하면 프로세스가 "종료 할 명령을 무시하십시오"라고 말합니다.
Martin Marconcini 2016 년

1
@ George2 : 그렇습니다. "행크에 대한 면역"== "프로세스 계속"및 "non-tty"== "터미널 콘솔 세션 종료"
추가 통지가있을 때까지 일시 중지되었습니다.

32

Bash 셸 스크립트에서 앰퍼샌드 "&"는 프로세스를 분기하는 데 사용됩니다.

find -name hello &

find 명령이 포크되어 백그라운드에서 실행됩니다 (PID로 언제든지 종료 할 수 있음).


고마워 마틴, ssh 터미널 로그를 컴퓨터에 사용하고 ssh 터미널을 사용하여 명령을 실행하고 (장기 프로세스 제공) 터미널 세션을 종료하면 명령의 장기 프로세스가 올바르게 종료됩니다 ? 그리고 ssh 터미널에서 &를 사용하여 명령을 실행하면 터미널을 종료하더라도 명령의 장기 프로세스가 계속 실행되고 있습니까?
George2

1
맞습니다. 조지입니다. 백그라운드 프로세스는 종료되거나 종료 될 때까지 계속되어야합니다. 그러나 이미 지적했듯이 사용자가 로그 오프 할 때 프로세스가 종료되지 않도록하려면 nohup이 필요합니다.
Martin Marconcini 2016 년

고마워 마틴! &와 nohup을 모두 사용해야하는 이유와 터미널 콘솔이 종료 되더라도 명령이 계속 실행되도록하는 개별 기능은 무엇인지 알고 싶습니다. nohup에 대한 매뉴얼 페이지를 읽고 "tty가 아닌 출력으로 행업에 면역 명령을 실행하십시오"라고 언급되어 있습니다. 터미널 콘솔? 그렇다면 nohup을 사용하는 것으로 충분하며 &를 사용할 필요가 없다고 생각합니다. 다른하실 말씀 있나요?
George2

1
&를 사용하지 않으면 터미널에서 다른 명령을 입력 할 수 없습니다. 그것을 보는 가장 좋은 방법은 그것을 시도하는 것입니다. find -name SomeName /> somefile.txt는 nohup 및 &로 시도하여 차이점을 확인하십시오.
Martin Marconcini 2016 년

이것은 nohup 질문에 대한 훌륭한 답변이 있습니다 : serverfault.com/questions/311593/…
joshperry

26

왜 '&'로 Linux 쉘 명령을 실행합니까?

프롬프트를 즉시 되돌리고 백그라운드에서 프로세스를 실행하십시오.

그들의 기능은 무엇입니까?

nohup 은 사용자가 로그 아웃 한 후에도 (또는 시작 쉘을 종료 한 후에도) 백그라운드 프로세스가 계속 실행되도록합니다.

> & 는 표준 출력과 표준 오류를 모두 로그 파일로 리디렉션합니다.

& 백그라운드에서 모든 것을 실행하여 즉시 프롬프트를 표시합니다.

설명:

모든 Linux 프로세스는 세 개의 I / O 채널, 입력 "stdin", 표준 출력 "stdout"및 표준 오류 출력 "stderr"을 엽니 다. 바이너리로 사용될 수 있지만 전통적으로 텍스트입니다. 대부분의 프로그램이 stdin close를 보이면 종료합니다 (프로그래머가 변경할 수 있음).

부모 껍질이 나오면 stdin이 자식에서 닫히고 종종 자식도 종료됩니다. 또한, 아이들은 SIGHUP이라는 소프트웨어 신호를 수신하는데, 이는 사용자가 "전화를 끊었다"(이전의 모뎀) 고 여기서 기본값은 종료하는 것입니다. (프로그래머는 프로그램을 작성할 때이 모든 것을 변경할 수 있습니다).

따라서 nohup은 자식 프로세스에 별도의 I / O 환경을 제공하여 부모 쉘에 묶이지 않은 것에 인과 아웃을 묶고 SIGHUP 신호로부터 자식을 보호합니다. 사용자가 연결을 끊으면 사용자의 쉘이 아닌 init가 소유 한 nohup 백그라운드 프로세스 (프로세스 1)가 표시됩니다.

그러나 nohup프로세스가 포 그라운드에서 실행되는 경우 작업을 완전히 수행 할 수 없으므로 백그라운드 &에서 프로그램을 실행하는 데 사용되며, 사용자가 로그인하거나 로그인하지 않아도 행복하게 실행할 수 있습니다.


ssh 터미널 로그를 시스템에 사용하고 ssh 터미널을 사용하여 명령을 실행하고 (장기 프로세스 제공) 터미널 세션을 종료하면 명령의 장기 프로세스가 올바르게 종료됩니다. 그리고 쉘을 종료해도 명령이 계속 실행되도록하려면 nohup 또는 & (명령 끝에서)를 사용하거나 nohup과 &를 모두 사용해야합니까?
George2

1
SSH 연결이 끊긴 후에 프로세스를 계속하려면 nohup과 &를 모두 사용하십시오.
kmarsh

감사합니다 Kmarsh! &와 nohup을 모두 사용해야하는 이유와 터미널 콘솔이 종료 되더라도 명령이 계속 실행되도록하는 개별 기능은 무엇인지 알고 싶습니다. nohup에 대한 매뉴얼 페이지를 읽고 "tty가 아닌 출력으로 행업에 면역 명령을 실행하십시오"라고 언급되어 있습니다. 터미널 콘솔? 그렇다면 nohup을 사용하는 것으로 충분하며 &를 사용할 필요가 없다고 생각합니다. 다른하실 말씀 있나요?
George2

1
답변을 편집 할 것입니다.
kmarsh

13

뿐만 아니라 마틴의 대답 @ : 앰퍼샌드의 다른 용도로 사용 ( >&위)을 모두 캡처하는 것입니다 stdoutstderr. 일반적으로 출력을 '>'만있는 파일로 경로 재 지정 stdout하면 오류가없는 출력 만 표시됩니다 .


1. 감사합니다. Ash, "> & <log file name>"은 모든 stderr 및 stdout을 로그 파일에 덤프합니다. 맞습니까? 2. "> <log file name>"을 사용하면 모든 stdout이 로그 파일에 덤프됩니다. 맞습니까?
George2

1
@ 조지 : 네, 그렇습니다.
Ash

고마워 애쉬! &와 nohup을 모두 사용해야하는 이유와 터미널 콘솔이 종료 되더라도 명령이 계속 실행되도록하는 개별 기능은 무엇인지 알고 싶습니다. nohup에 대한 매뉴얼 페이지를 읽고 "tty가 아닌 출력으로 행업에 면역 명령을 실행하십시오"라고 언급되어 있습니다. 터미널 콘솔? 그렇다면 nohup을 사용하는 것으로 충분하며 &를 사용할 필요가 없다고 생각합니다. 다른하실 말씀 있나요?
George2

4

Martin과 Ash의 답변 외에도 때때로 &&토큰 사용이 표시 될 수 있습니다 . "첫 번째 명령이 성공적으로 실행 된 경우에만 두 번째 명령을 실행하십시오"라고 말하는 데 사용됩니다. 잘 작성된 명령은 오류가 있으면 성공적으로 종료되지 않습니다.

[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$

쿨, 케빈! ssh 터미널 로그를 시스템에 사용하고 ssh 터미널을 사용하여 명령을 실행 한 다음 (장기 프로세스 제공) 터미널 세션을 종료하면 명령의 장기 프로세스가 올바르게 종료됩니까? 그리고 쉘을 종료하더라도 명령이 계속 실행되도록하려면 nohup 또는 & (명령 끝에서)를 사용하거나 nohup 및 &를 모두 사용해야합니까?
George2

어느 쪽이든 작동합니다. NOHUP은 그것을하는 원래의 방법이었습니다. 그러나 나는 완전히 추측하지만 배경은 지금 작동합니다. 중요한 차이점은 원격 시스템으로 sshing하여 대화식 쉘을 실행할 때입니다. NOHUP 프로세스는 포 그라운드에서 실행되지만 종료하면 계속 실행되지만 백그라운드 프로세스는 명령을 생성 한 직후에 반환됩니다. 그러나 백그라운드에서 실행중인 명령으로 대화식 쉘을 종료하려고하면 먼저 경고가 표시됩니다.
케빈 M

2

마틴의 대답은 좋지만 약간 모호합니다. 명령은 항상 포크되고 실행되지만 일반적인 쉘 동작은 명령이 종료 될 때까지 명령을 기다리는 것입니다. 앰퍼샌드가 백그라운드로 입력되어 터미널 프롬프트가 다시 표시되고 다른 작업을 수행 할 수 있습니다. 프로세스가 데이터를 stdout 또는 stderr에 뱉어 내면 프롬프트에서 수행하는 작업과 혼합되어 혼동 될 수 있습니다. 이것이> & /path/to/logfile.txt로 경로를 재지 정하는 이유입니다.

George2에 대한 응답으로 쉘 종료에 대한 일반적인 동작은 SIGHUP 신호를 동일한 프로세스 그룹 (본질적으로 생성 한 것)의 모든 프로세스에 전송하는 것이며 일반적으로 종료됩니다. 쉘 프로세스를 닫아도이 작업을 계속하려면 nohup 명령을 사용하여이 신호를 무시하고 계속 실행하십시오. 이러한 유형의 프로세스에는 특별한 이름이 있는데,이를 데몬 프로세스 ( '데몬'이라고 함)라고합니다.


고마워 리치! ssh 터미널 로그를 시스템에 사용하고 ssh 터미널을 사용하여 명령을 실행 한 다음 (장기 프로세스 제공) 터미널 세션을 종료하면 명령의 장기 프로세스가 올바르게 종료됩니까? 그리고 쉘을 종료하더라도 명령이 계속 실행되도록하려면 nohup 또는 & (명령 끝에서)를 사용하거나 nohup 및 &를 모두 사용해야합니까? 그리고 왜?
George2

조지, 늦어서 미안해 예, 셸을 종료하면 장기 프로세스가 종료됩니다. 계속 진행하려면 nohup (쉘을 닫을 때 종료되지 않도록) 및 & (백그라운드에 놓기 위해 Crtl-D를 사용하거나 쉘을 종료 할 수 있음)를 모두 수행해야합니다. 또한 setsid 명령을 보면 약간 다른 방식으로 SIGHUP을 무시하고 프로세스를 실행할 수 있습니다.
Rich Homolka

정답은 백그라운드 실행 셸 시작 프로세스에 대한 모범 사례를 설명합니다.
Marcel Valdez Orozco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.