프로세스 목록에 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(및 기타) 인스턴스를 볼 수 있습니다.분명히 두 번 뛰는 것 같아, 그 중 하나는 를 통해 시작되었고 bash다른 하나는 를 통해 시작되었습니다 /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

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

관련 정보