동일한 스크립트의 두 복사본이 실행되도록 한 지점에서 포크하려는 스크립트가 있습니다.
예를 들어 다음 bash 스크립트가 존재합니다.
echo $$
do_fork()
echo $$
이 bash 스크립트가 실제로 존재하면 예상되는 결과는 다음과 같습니다.
<ProcessA PID>
<ProcessB PID>
<ProcessA PID>
또는
<ProcessA PID>
<ProcessA PID>
<ProcessB PID>
“do_fork ()”대신 이런 종류의 출력을 얻거나 bash 스크립트가 C와 같은 포크를 수행하도록 할 수있는 것이 있습니까?
답변
예. 포크는 철자가 &
:
echo child & echo parent
혼란 스러울 수있는 것은 $$
쉘 프로세스의 PID가 아니라 원래 쉘 프로세스 의 PID입니다 . 이런 식으로 만드는 요점은 $$
쉘 스크립트의 특정 인스턴스에 대한 고유 식별자라는 것입니다. 스크립트 실행 중에 변경되지 않으며 $$
동시에 실행되는 다른 스크립트 와 다릅니다 . 쉘 프로세스의 실제 PID를 얻는 한 가지 방법은 sh -c 'echo $PPID'
입니다.
셸의 제어 흐름은 C와 동일하지 않습니다. C에서 작성하는 경우
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
orignal Bourne 쉘에는 없었지만 POSIX에는 있습니다 (따라서 ash, bash, ksh, zsh 등).
답변
예,이를 subshells 라고 합니다. 괄호 안의 셸 코드는 하위 셸 (포크)로 실행됩니다. 그러나 첫 번째 쉘은 일반적으로 자식이 완료되기를 기다립니다. &
터미네이터를 사용하여 비 동기화 할 수 있습니다 . 다음과 같이 실제로 작동하는지 확인하십시오.
#!/bin/bash
(sleep 2; echo "subsh 1")&
echo "topsh"
$ bash subsh.sh
답변
이 작업을 수행하는 기본 배쉬 (또는 다른 일반적인 * nix 셸) 방법은 없습니다. 비동기 적으로 다른 것을 수행하는 분기 된 프로세스를 생성하는 방법은 많이 있지만, fork () 시스템 호출의 정확한 의미를 따르는 것은 없다고 생각합니다.
일반적인 접근 방식은 최상위 스크립트가 원하는 작업을 수행하는 도우미를 생성하는 것입니다. 당신이 $0 $@ &
하거나 무엇이든간에, 당신은 처음부터 다시 시작하고 어떻게 든 알아낼 필요가 있습니다.
나는 실제로 그 일을 할 수있는 몇 가지 영리한 방법을 생각하기 시작했습니다 ….
그러나 , 내 두뇌가 너무 빠져 들기 전에 꽤 좋은 규칙이라고 생각합니다. 쉘로 무언가를 쓰려고 노력하고 영리한 트릭으로 가득 차 있고 더 많은 언어 기능을 원한다면 전환 할 시간입니다. 실제 프로그래밍 언어로 .