web-dev-qa-db-fra.com

Script Bash et processus créés

J'ai un script bash fonctionnant comme un cron su toutes les 10 minutes. En plus du script, je déclare:

#!/bin/bash

Dans crontab, je l'exécute avec/bin/bash. Je fais de même avec tous les scripts appelés depuis mon script principal.

J'ai remarqué que deux threads sont créés:

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

De plus, tous les autres scripts appelés obtiennent leur propre thread unique (uniquement bash).

Pourriez-vous m'expliquer ce comportement?

1
rwms

Cron utilise un Shell pour exécuter les commandes. Dans le cas de cet utilisateur, c'est /bin/sh, donc pour une ligne comme:

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

Cron s'exécute:

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

Si l'ensemble Shell était /bin/bash, il s'exécuterait:

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

Maintenant, pourquoi ne voyez-vous pas le bash -c processus avec bash? Bash, quand on lui donne une commande simple et simple, directement execs la commande au lieu de forking et execing:

$ 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 +++

Avec dash, qui est /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 +++

Vous pouvez voir le clone supplémentaire ici.

4
muru