Script de shell do Linux duplicado na lista de processos

Script de shell do Linux duplicado na lista de processos

Eu desenvolvi umScript bashque aceita parâmetros:

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

Eu chamo isso atravésCRONem horários diferentes e com parâmetros diferentes:

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

Ao querer saber o queinstâncias estão em execução(o script não é muito longo, apenas alguns segundos de execução):

$ 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

Podemos ver no exemplo acima a MyScript.sh 21(e qualquer outra) instânciaaparentemente correndo duas vezes, um deles começou via bashe o outro via /bin/sh -c. Ambos começam e terminam ao mesmo tempo, como confirmei com htop.

Estou realizando esses testes no RaspBian (Debianbaseado).

Aqui abaixo está um exemplo do que acontece ao executar o mesmo script emFreeBSD:

$ 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

Como pode ser visto, o BSD não possui essas instâncias repetidas.

Por que isso está acontecendono RaspBian e como eu poderiaresolveristo? Na verdade, preciso "resolver" isso?

Responder1

Seu script está fazendo algo dentro dos subshells. Exemplo:

#!/usr/bin/env bash

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

(sleep 10; echo inner done)
echo outer done

Se você executar o primeiro deles, não haverá subshell, então você verá apenas um deles na lista de processos. Se você executar o segundo deles, haverá um subshell, então ele será bifurcado e você verá dois deles na lista de processos. (Se você quiser mais detalhes sobre sua situação exata, poste o conteúdo completo do seu script na pergunta.)

informação relacionada