Script de bash e processos criados

1

Eu tenho um script bash rodando como um su cron a cada 10 minutos. No topo do script eu declaro:

#!/bin/bash

No crontab eu estou rodando com / bin / bash. Eu faço o mesmo com todos os scripts chamados do meu script principal.

Eu notei que dois tópicos são criados:

/bin/bash /main/script
/bin/sh -c /main/script

Além disso, todos os outros scripts que são chamados obtêm seu próprio thread único (somente bash).

Você poderia explicar esse comportamento para mim?

    
por rwms 29.05.2017 / 16:58

1 resposta

3

O Cron usa um shell para executar os comandos. No caso do usuário, isso é /bin/sh , portanto, para uma linha como:

* * * * * /bin/bash /some/script

Cron é executado:

/bin/sh -c '/bin/bash /some/script'

Se o conjunto de shell for /bin/bash , ele será executado:

/bin/bash -c '/bin/bash /some/script

Agora, por que você não vê o processo bash -c com o bash? Bash, quando dado um único comando simples, diretamente exec s o comando em vez de fork ing e exec ing:

$ strace -fe clone,execve bash -c 'bash foo.sh'
execve("/bin/bash", ["bash", "-c", "bash foo.sh"], [/* 15 vars */]) = 0
execve("/bin/bash", ["bash", "foo.sh"], [/* 15 vars */]) = 0
clone(Process 466 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f93bda10a10) = 466
[pid   466] execve("/bin/true", ["/bin/true"], [/* 15 vars */]) = 0
[pid   466] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=466, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

Com dash , que é /bin/sh :

$ strace -fe clone,execve dash -c 'bash foo.sh'
execve("/bin/dash", ["dash", "-c", "bash foo.sh"], [/* 15 vars */]) = 0
clone(Process 473 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f7f31650a10) = 473
[pid   473] execve("/bin/bash", ["bash", "foo.sh"], [/* 15 vars */]) = 0
[pid   473] clone(Process 474 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f408d740a10) = 474
[pid   474] execve("/bin/true", ["/bin/true"], [/* 15 vars */]) = 0
[pid   474] +++ exited with 0 +++
[pid   473] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=474, si_status=0, si_utime=0, si_stime=0} ---
[pid   473] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=473, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

Você pode ver o clone extra aqui.

    
por muru 29.05.2017 / 19:29