리디렉션을 사용하여 쉘 명령을 완전히 분기하는 방법

리디렉션을 사용하여 쉘 명령을 완전히 분기하는 방법

나는 수년에 걸쳐 꽤 많은 쉘 스크립트를 작성했지만(확실히 시스템 관리자는 아닙니다), 항상 문제를 일으키는 몇 가지 사항이 있습니다. 정지에 영향을 받지 않는 쉘 명령을 백그라운드에서 생성하려면 어떻게 해야 합니까? ?불다스크립트?

예를 들어, 다음이 있는 경우:

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

disownbash 내장 명령이 있습니다 :

[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

관련 정보