">/dev/null 2>&1 &"를 사용하여 실행할 때 로그아웃 시 작업이 종료되지 않는 이유는 무엇입니까?

">/dev/null 2>&1 &"를 사용하여 실행할 때 로그아웃 시 작업이 종료되지 않는 이유는 무엇입니까?

다음 예시와 같은 작업을 실행하면 로그아웃 시 해당 작업이 종료됩니다.

$ ./job.sh &

그러나 아래 예와 같이 stdout을 stdout으로 /dev/null, stderr을 stdout으로 리디렉션하고 작업을 백그라운드에 배치하여 실행하면 로그아웃할 때 해당 작업이 종료되지 않습니다. 출력이 /dev/null파일 대신 파일 로 이동한다는 점을 제외하면 nohup과 약간 비슷합니다 .

$ ./job.sh > /dev/null 2>&1 &

일부 데몬이 이와 같이 작동한다는 것을 알았고 로그아웃 시 왜 데몬이 종료되지 않는지 궁금했습니다.

누군가 이유를 설명할 수 있나요?

편집 1:

@Patrick이 자신의 의견에서 제안한 것처럼 동일한 결과로 동일한 간단한 작업을 시도했습니다. 로그아웃해도 작업이 사라지지 않습니다.

# while true; do sleep 1; done > /dev/null 2>&1 &
[1] 4320
# logout

luis-macbook:~ luis$
luis-macbook:Downloads luis$ ssh server
luis.alen@server's password: 
# jobs
#
# ps -ef | grep 4320
root      4320     1  0 01:17 ?        00:00:00 -bash

편집 2:

Patrick이 다시 물었을 때 스트림을 리디렉션하지 않고 동일한 테스트를 실행했는데 놀랍게도 프로세스가 종료되지 않았습니다. 지금 완전 혼란스럽네요... 로그아웃하면 백그라운드에 넣어두었던 프로세스가 사라지는걸로 기억합니다. 내가 완전히 틀렸나요?

# while true; do sleep 1; done &
[1] 20720
# logout
luis-macbook:~ luis$ ssh server
# jobs
#
# ps -ef | grep 20720
root     20720     1  0 23:31 ?        00:00:00 -bash

답변1

이 작업을 수행하는 데몬의 경우, 프로세스의 입력 및 출력 스트림을 어떻게 리디렉션하든 관계없이 생성할 수 있는 모든 출력이나 오류 메시지를 삭제하기를 원하기 때문에 세션에 연결되어 있고 해당 세션이 SIGHUP 신호. 프로세스를 계속 실행하려면 종료하세요.

프로세스를 계속 실행하는 방법에는 여러 가지가 있습니다.

  1. 세션에서 분리합니다. 데몬은 새 프로세스를 포크한 다음 원래 프로세스를 종료하여 이를 수행합니다. 이제 새 프로세스에는 상위 프로세스가 없으며 사용자가 채택합니다. init bash 내부 명령 disown을 사용하여 이 작업을 수행할 수도 있습니다.

  2. 세션이 종료될 때 프로세스가 SIGHUP을 수신하지 못하도록 방지하는 데 사용됩니다 nohup. 프로세스가 SIGHUP을 얻지 못하고 종료되지 않으며 상위 프로세스가 종료되고 init가 이를 가져옵니다.

  3. 사라지지 않는 세션에 연결 - 화면 사용

> /dev/null 2>&1 &"실행 중 로그아웃 시 작업이 종료되지 않습니다."라는 문구에 대한 작업을 다시 확인하시기 바랍니다.

답변2

내가 아는 한, 이것은 bash에서의 작업 동작이므로 여기에서 테스트를 수행했으며 다음 스트림이 열린 상태에서도 계속 실행됩니다.

sergiopa@sergiopa:~/Downloads$ find / -print >/dev/null 2>&1 &
[1] 14152
sergiopa@sergiopa:~/Downloads$ jobs
[1]+  Running                 find / -print > /dev/null 2>&1 &
sergiopa@sergiopa:~/Downloads$ ps -ef | grep find
sergiopa 14152 13913 10 15:47 pts/18   00:00:01 find / -print
sergiopa 14195 13913  0 15:48 pts/18   00:00:00 grep --color=auto find
sergiopa@sergiopa:~/Downloads$ 

sergiopa@sergiopa:~/Downloads$ lsof -c find
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
find    14152 sergiopa  cwd    DIR  252,1     4096     4808 /usr/src/linux-headers-2.6.35-22/drivers/rapidio
find    14152 sergiopa  rtd    DIR  252,1     4096        2 /
find    14152 sergiopa  txt    REG  252,1   141980   391686 /usr/bin/find
find    14152 sergiopa  mem    REG  252,1  1421892    26489 /lib/libc-2.12.1.so
find    14152 sergiopa  mem    REG  252,1   118084    26452 /lib/ld-2.12.1.so
find    14152 sergiopa  mem    REG  252,1   149392    26485 /lib/libm-2.12.1.so
find    14152 sergiopa  mem    REG  252,1    30684    26469 /lib/librt-2.12.1.so
find    14152 sergiopa  mem    REG  252,1   121578    26490 /lib/libpthread-2.12.1.so
find    14152 sergiopa  mem    REG  252,1  2768240   391861 /usr/lib/locale/locale-archive
find    14152 sergiopa    0u   CHR 136,18      0t0       21 /dev/pts/18 <<<<
find    14152 sergiopa    1w   CHR    1,3      0t0     4293 /dev/null   <<<<
find    14152 sergiopa    2w   CHR    1,3      0t0     4293 /dev/null   <<<<
find    14152 sergiopa    3r   DIR  252,3     4096 16777344 /home/sergiopa/Downloads
find    14152 sergiopa    4r   DIR  252,3     4096 16777344 /home/sergiopa/Downloads
find    14152 sergiopa    5r   DIR  252,1     4096     4808 /usr/src/linux-headers-2.6.35-22/drivers/rapidio
sergiopa@sergiopa:~/Downloads$ 

"<<<<" 줄을 보면 STDIN, STDOUT, STDERR이 있습니다. 쉘을 닫았지만 find는 여전히 실행 중입니다.

관련 정보