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