리디렉션을 사용하는 쉘 명령을 완전히 포크하는 방법


13

나는 몇 년 동안 꽤 많은 쉘 스크립트를 작성했지만 (확실히 sysadmin은 아닙니다) 항상 문제를 일으킨 것이 있습니다 : Bash 스크립트 의 백그라운드에서 끊어지지 않는 쉘 명령을 어떻게 포크 할 수 있습니까?

예를 들어 내가 이것을 가지고 있다면 :

command_which_takes_time input > output

어떻게 "노프"하고 포크 할 수 있습니까?

다음은 내가 원하는 것을하지 않는 것 같습니다.

nohup command_which_takes_time input > output &

찾고있는 구문은 무엇이며 이해하지 못하는 것은 무엇입니까?

답변:


13

다음을 사용하여 서브 쉘을 작성하십시오 (...).

( 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 )

18

당신은 시도해야합니다 setsid(1). 사용하는 것처럼 사용하십시오 nohup.

setsid command_which_takes_time input > output

이 (당으로 setsid(2)하는 작업을 수행 맨) fork(2), _exit(2)부모 프로세스의 후 자식 프로세스의 호출은 setsid(2)새로운 프로세스 그룹 (세션)을 만들 수 있습니다.

로그 아웃하여 그것을 죽일 수 없으며 Bash 작업 제어 shebang의 일부가 아닙니다. 모든 의도와 목적을 위해 적절한 데몬입니다.


4

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:~#

disown 후에 는 작업이 셸에서 제거되어 로그 아웃 할 수 있으며 완료 될 때까지 계속 실행됩니다.

삭제 되지 않은 두 번째 jobs명령은 목록에 있는 첫 번째 명령을 참조하십시오 . 그러나를 사용하면 작업이 여전히 실행되고 있음을 알 수 있습니다.sleepjobsps


2

Freebsd :

/usr/sbin/daemon -f <command> <command args>

-2

이것은 작동합니다 (추가 공백을 입력하지 마십시오).

command &>output.file

1
이것은 포크와 동등하지 않기 때문에 질문과 관련이없는 것 같습니다 nohup.
Dan Getz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.