다음 예시와 같은 작업을 실행하면 로그아웃 시 해당 작업이 종료됩니다.
$ ./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 신호. 프로세스를 계속 실행하려면 종료하세요.
프로세스를 계속 실행하는 방법에는 여러 가지가 있습니다.
세션에서 분리합니다. 데몬은 새 프로세스를 포크한 다음 원래 프로세스를 종료하여 이를 수행합니다. 이제 새 프로세스에는 상위 프로세스가 없으며 사용자가 채택합니다.
init
bash 내부 명령 disown을 사용하여 이 작업을 수행할 수도 있습니다.세션이 종료될 때 프로세스가 SIGHUP을 수신하지 못하도록 방지하는 데 사용됩니다
nohup
. 프로세스가 SIGHUP을 얻지 못하고 종료되지 않으며 상위 프로세스가 종료되고 init가 이를 가져옵니다.사라지지 않는 세션에 연결 - 화면 사용
> /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는 여전히 실행 중입니다.