`> my.log 2>&1 &`로 인해 작업이 계속 로그아웃되는 이유는 무엇입니까?

`> my.log 2>&1 &`로 인해 작업이 계속 로그아웃되는 이유는 무엇입니까?

나는 사용한다

myscript > my.log 2>&1 &

스크립트를 실행하고 출력을 수집합니다. 이렇게 하면 로그아웃해도 스크립트가 계속 실행됩니다. 시작하겠습니다 myscript &. 로그아웃 후 즉시 종료됩니다.

그러나 이것은 이상한 효과를 가지고 있습니다: > my.log 2>&1 &그것이 하는 일은 stderr를 stdout으로 리디렉션하는 것뿐입니다...

> my.log 2>&1 &작업이 계속 로그아웃되는 이유는 무엇 입니까?

답변1

일반적으로 백그라운드에 무언가를 넣으면 상위 셸이 종료된 후에도 계속 실행됩니다. 실제로 다음과 같은 테스트 사례를 만들 수 있습니다.

/bin/sh -c 'while true; do echo hi; sleep 5; done' &

그런 다음 셸을 종료하고 를 사용하면 ps셸을 종료할 때까지 계속 실행되는 것을 볼 수 있습니다.

출력을 리디렉션하는 것과 출력을 리디렉션하지 않는 것에는 한 가지 차이점이 있습니다. 출력을 리디렉션하지 않고 셸을 종료하면 stdout/stderr 파일 설명자가 닫히고 다음에 쓰려고 할 때 쓰기 작업이 실패합니다. 스크립트가 이를 확인 중이거나 -e(오류 시 종료) 옵션이 설정된 상태로 실행 중이면 스크립트가 중지됩니다. 위 동작을 이 버전과 비교해 보세요.

/bin/sh -c 'while true; do echo hi || exit 1; sleep 5; done' &

또는

/bin/sh -ec 'while true; do echo hi; sleep 5; done' &

ps계속 실행 중인 경우 셸을 종료한 다음 다음을 echo사용하세요 .

출력을 파일로 리디렉션하는 경우 분명히 쓰기가 더 이상 실패하지 않고 스크립트가 계속 실행됩니다.

답변2

이것과는 아무 상관이 없습니다 > my.log 2>&1. 대신 &final의 역할은 백그라운드에서 프로세스를 실행하는 것입니다. 명령을 입력한 후 반환된 줄에는 (pid)라는 숫자가 표시되어야 합니다 process id. 필요한 경우 나중에 명령과 함께 이 번호를 사용하여 kill프로세스를 종료할 수 있습니다.

그럼에도 불구하고 귀하의 경우 screen다음 명령을 사용할 수 있습니다.

screen -S <name>

그런 다음 명령을 실행하십시오. 화면에서 나가려면(원래 터미널로 돌아가기) CTRL및 키를 A차례로 눌러야 합니다 D. 화면을 다시 연결하려면 다음을 입력하십시오.

screen -r <name>

이와 같이(화면에서 작업 실행) 사용자가 로그아웃하거나 연결이 끊어진 경우에도 실행되며 가장 좋은 점은 reattach 명령을 사용하여 결과를 볼 수 있다는 것입니다.

답변3

불멸 프로세스와 데몬 프로세스를 비교해 보겠습니다. 데몬은 사용자나 터미널과 상호 작용하지 않으며 init가 종료될 때 종료됩니다(의도적으로 중지하지 않는 한).

nohup을 사용하고 std.out 및 std.err을 /dev/null로 리디렉션하여 "데몬 생성"을 수행할 수 있습니다.

nohup ping google.com 2> /dev/null > /dev/null - 이것은 기념비적인 일입니다.

관련 정보