![리디렉션을 사용하여 쉘 명령을 완전히 분기하는 방법](https://linux55.com/image/20298/%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%89%98%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%99%84%EC%A0%84%ED%9E%88%20%EB%B6%84%EA%B8%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 수년에 걸쳐 꽤 많은 쉘 스크립트를 작성했지만(확실히 시스템 관리자는 아닙니다), 항상 문제를 일으키는 몇 가지 사항이 있습니다. 정지에 영향을 받지 않는 쉘 명령을 백그라운드에서 생성하려면 어떻게 해야 합니까? ?불다스크립트?
예를 들어, 다음이 있는 경우:
command_which_takes_time input > output
어떻게 "nohup"하고 포크할 수 있나요?
다음은 내가 원하는 효과를 내지 못하는 것 같습니다.
nohup command_which_takes_time input > output &
내가 찾고 있는 구문은 무엇이며, 내가 이해하지 못하는 것은 무엇입니까?
답변1
당신은 그것을 시도해야합니다 setsid(1)
. 다음과 같이 사용하십시오 nohup
.
setsid command_which_takes_time input > output
이것은(man 페이지에 따라 ) setsid(2)
상위 프로세스의 fork(2)
, 를 실행한 _exit(2)
다음 하위 프로세스 호출이 setsid(2)
새 프로세스 그룹(세션)을 생성합니다.
로그아웃해도 죽일 수 없으며 Bash 작업 제어 기능의 일부도 아닙니다. 모든 의도와 목적을 위해 적절한 데몬입니다.
답변2
다음 명령을 사용하여 서브셸을 만들어 보십시오 (...)
.
( command_which_takes_time input > output ) &
예:
~$ ( (sleep 10; date) > /tmp/q ) &
[1] 19521
~$ cat /tmp/q # ENTER
~$ cat /tmp/q # ENTER
(...) #AFTER 10 seconds
~$ cat /tmp/q #ENTER
Wed Jan 11 01:35:55 CET 2012
[1]+ Done ( ( sleep 10; date ) > /tmp/q )
답변3
disown
bash 내장 명령이 있습니다 :
[1] 9180
root@ntb1:~# jobs
[1]+ Running sleep 120 &
root@ntb1:~# disown
root@ntb1:~# jobs
... no jobs, disowned
root@ntb1:~# ps aux | grep sleep | grep -v grep
root 9180 0.0 0.0 4224 284 pts/0 S 17:55 0:00 sleep 120
... but the sleep still runing
root@ntb1:~#
뒤쪽에부인하다, 작업은 쉘에 독립적이며(로그아웃할 수도 있음) 완료될 때까지 계속 실행됩니다.
jobs
나열된 첫 번째 명령을 참조하세요 sleep
. 그러나 거부 이후의 두 번째 명령 jobs
은 나열되지 않습니다. 그러나 를 사용하면 ps
작업이 여전히 실행 중임을 알 수 있습니다.
답변4
다음과 같이 하면 됩니다(추가 공백을 입력하지 마세요).
command &>output.file