Linux 쉘 스크립트가 프로세스 목록에 중복됩니다.

Linux 쉘 스크립트가 프로세스 목록에 중복됩니다.

나는배쉬 스크립트매개변수 승인:

$ head -n 3 MyScript.sh
#!/usr/bin/env bash
# This is my script
#... do something

나는 그것을 이렇게 부른다.크로나다양한 일정과 다양한 매개변수 하에서:

$ crontab -l
* * * * * MyScript.sh 1 -t 600
*/2 * * * * MyScript.sh 40
*/3 * * * * MyScript.sh 41,42
*/5 * * * * MyScript.sh 61
* * * * * MyScript.sh 21

뭔가 알고 싶을 때인스턴스가 실행 중입니다.(스크립트는 그리 길지 않으며 단지 몇 초 동안만 실행됩니다):

$ pgrep -f -a -l "MyScript.sh"
25003 /bin/sh -c MyScript.sh 21
25005 /bin/sh -c MyScript.sh 41,42
25006 bash /bin/MyScript.sh 21
25007 bash /bin/MyScript.sh 41,42
25008 /bin/sh -c MyScript.sh 40
25009 bash /bin/MyScript.sh 40
25010 /bin/sh -c MyScript.sh 1 -t 600
25012 bash /bin/MyScript.sh 1 -t 600

MyScript.sh 21위의 예 (및 기타) 사례 에서 볼 수 있습니다.분명 두번이나 뛰었는데, 하나는 via 에서 시작 bash하고 다른 하나는 via 에서 시작합니다 /bin/sh -c. 제가 확인한 대로 둘 다 동시에 시작하고 끝납니다 htop.

RaspBian에서 이 테스트를 실행하고 있습니다(더반)을 기반으로 합니다.

다음은 동일한 스크립트를 실행할 때 발생하는 일의 예입니다.FreeBSD:

$ pgrep -f -a -l "MyScript.sh"
78230 bash /bin/MyScript.sh 103
78106 bash /bin/MyScript.sh 470
77484 bash /bin/MyScript.sh 2
77430 bash /bin/MyScript.sh 451
77019 bash /bin/MyScript.sh 52
76922 bash /bin/MyScript.sh 101 -v -d
76642 bash /bin/MyScript.sh 1 -t 600
76174 bash /bin/MyScript.sh 102 -v -d

볼 수 있듯이 BSD에는 이러한 중복 인스턴스가 없습니다.

왜 이런 일이 발생합니까?RaspBian에서 어떻게 해야 하나요?해결하다그것? 실제로 문제를 "해결"해야 합니까?

답변1

스크립트가 서브셸 내부에서 작업을 수행하고 있습니다. 예:

#!/usr/bin/env bash

sleep 10
echo outer done
#!/usr/bin/env bash

(sleep 10; echo inner done)
echo outer done

이들 중 첫 번째를 실행하면 하위 쉘이 없으므로 프로세스 목록에는 그 중 하나만 표시됩니다. 두 번째를 실행하면 하위 쉘이 생기므로 분기되고 프로세스 목록에 두 개가 표시됩니다. (특정 상황에 대해 더 자세히 알고 싶으시면 질문에 스크립트의 전체 내용을 게시해 주세요.)

관련 정보