한 지점에서 포크하려는 스크립트가 있으므로 동일한 스크립트의 두 복사본이 실행됩니다.
예 : , 다음 bash 스크립트가 존재하기를 바랍니다.
echo $$ do_fork() echo $$
이 bash 스크립트가 실제로 존재한다면 예상되는 출력은 다음과 같습니다.
<ProcessA PID> <ProcessB PID> <ProcessA PID>
또는
<ProcessA PID> <ProcessA PID> <ProcessB PID>
이를 얻기 위해 “do_fork ()”대신 사용할 수있는 것이 있습니까? 어떤 종류의 출력입니까, 아니면 bash 스크립트가 C와 유사한 포크를 수행하게합니까?
Answer
예. 포크의 철자는 &
:
echo child & echo parent
혼란스러운 점은 $$
는 쉘 프로세스의 PID가 아니라 “ 원래 쉘 프로세스의 PID입니다. 이렇게 만드는 요점은 $$
는 셸 스크립트의 특정 인스턴스에 대한 고유 식별자입니다. “스크립트 실행 중에 변경되지 않으며 동시에 실행되는 다른 모든 항목의 $$
와”다릅니다. 스크립트. 쉘 프로세스의 실제 PID를 얻는 한 가지 방법은 sh -c "echo $PPID"
입니다.
쉘의 제어 흐름은 C와 동일하지 않습니다. C에서 “d write
first(); fork(); second(); third();
그러면 해당하는 쉘은
after_fork () { second; third; } first; after_fork & after_fork
간단한 쉘 형식입니다. first; child & parent
는 일반적인 C 관용구에 해당합니다.
first(); if (fork()) parent(); else child();
&
및 $$
는 모든 Bourne 스타일 셸과 (t) csh에서 이러한 방식으로 존재하고 작동합니다. $PPID
는 원래 Bourne에 존재하지 않았습니다. 쉘이지만 POSIX에 있습니다 (따라서 ash, bash, ksh, zsh,…에 있습니다).
댓글
답변
예, 서브 셸 이라고합니다. 괄호 안의 셸 코드는 하위 셸 (포크). 그러나 첫 번째 셸은 일반적으로 자식이 완료 될 때까지 기다립니다. &
종료자를 사용하여 비동기로 만들 수 있습니다. 다음과 같이 작동하는 모습을 확인하세요.
#!/bin/bash (sleep 2; echo "subsh 1")& echo "topsh"
$ bash subsh.sh
댓글
- 괄호는 서브 쉘을 만듭니다. ,하지만 '의 fork + wait.
&
는 포크 만 있습니다. 하위 프로세스에서 파이프 라인을 두 개 이상 실행하려면 ' 중괄호를 사용하기에 충분합니다 (하위 프로세스를 생성하지 않고 그룹화를 수행함) :{ sleep 2; echo child; } &
답변
네이티브가 없습니다. bash (또는 내가 아는 한 다른 일반적인 * nix 쉘) 방법. “비동기 적으로 다른 작업을 수행하는 분기 된 프로세스를 생성하는 많은 방법이 있지만 fork () 시스템 호출의 정확한 의미를 따르는 것은”없다고 생각합니다.
일반적인 접근 방식은 다음과 같습니다. 원하는 작업 만 수행하는 도우미에서 최상위 스크립트를 생성하도록하는 것입니다. $0 $@ &
등을 수행하면 처음부터 다시 시작해야합니다. 어떻게 든 알아 내세요.
실제로 그렇게 할 수있는 여러 가지 현명한 방법을 생각하기 시작했습니다 ….
하지만 , 제 뇌가 그것에 너무 몰두하기 전에 꽤 좋은 규칙은 다음과 같습니다. “쉘에 무언가를 작성하려고하는데 영리한 속임수로 가득 차 있으며 “더 많은 언어 기능을 원합니다. 실제 프로그래밍 언어로 전환 할 시간 입니다.
댓글
- 당신의 요점은 잘 받아 들여졌지만-bash '의 구문은 틀림없이 어렵고 ' Perl 또는 Python의보다 우아한 데이터 구조와 기능이 누락 된 bash는 도메인 에서 얻을 수있는 실제와 같습니다. 그것은 도메인에 특화된 언어이며, 많은 경우에 파이썬보다 훨씬 더 낫다고 주장합니다 (더 간결하고 간단합니다). 방대한 시스템을 관리 할 수 있지만 Python을 알지 못합니까? 예. 당신은 그것을 할 수 있고 bash [프로그래밍]의 핥는 것을 알지 못합니까? 시도하고 싶지는 않습니다. ' 30 년 동안의 쉘 프로그래밍 끝에 ' 실제와 같이 말합니다. 네, 저는 파이썬을 사용합니다. 하지만 ' 젊은이들을 혼동하지 마십시오.
- 기술적으로는이 답변이 더 좋습니다. " & "가 사용자에 대한 답이라고 말하는 것 '의 질문 인 " 한 지점에서 분기하여 동일한 스크립트의 두 복사본이 실행되도록 " 혼란스러운 마음. Bash 매뉴얼에 따르면 " & "가하는 일은 " … [주어진] 명령을 서브 쉘의 백그라운드에서 실행합니다. " 명령을 종료해야하며 포크 (기술적으로 , Linux에서는 clone ())이지만이 시점에서 동일한 스크립트의 두 복사본이 실행되지 않습니다.
&
는 포크입니다. ' 관련된 exec가 없습니다. Fork + exec는 외부 명령을 실행할 때입니다.exec
는 없지만 두 언어의 제어 흐름이 다릅니다.&
는 주어진 명령이 실행되는 서브 쉘을 시작합니다. 포크 + exec. ' 실행할 선행 명령없이&
를 넣을 수는 없습니다.&
를 한 줄에 표시합니다. 하지만 ' 할 수 있습니다. ' " 여기에서 포크 "를 의미하지는 않습니다. 이는 " 하위 셸의 백그라운드에서 이전 명령을 실행 함을 의미합니다 ".