Сценарий Bash и созданные процессы

Если вы предпочитаете терминал, вы можете сделать это следующим образом:

echo "PACKAGENAME hold" | sudo dpkg --set-selections
1
задан 29 May 2017 в 17:58

3 ответа

Cron использует оболочку для запуска команд. В случае этого пользователя это /bin/sh, поэтому для строки типа:

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

Cron работает:

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

Если набор оболочек был /bin/bash, он будет запускаться :

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

Теперь почему вы не видите процесс bash -c с bash? Bash, когда задана простая простая команда, непосредственно exec использует команду вместо fork ing и 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 +++

С dash, которая является /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 +++

Здесь вы можете увидеть дополнительный клон.

3
ответ дан 22 May 2018 в 22:06

Cron использует оболочку для запуска команд. В случае этого пользователя это /bin/sh, поэтому для строки типа:

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

Cron работает:

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

Если набор оболочек был /bin/bash, он будет запускаться :

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

Теперь почему вы не видите процесс bash -c с bash? Bash, когда задана простая простая команда, непосредственно exec использует команду вместо fork ing и 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 +++

С dash, которая является /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 +++

Здесь вы можете увидеть дополнительный клон.

3
ответ дан 18 July 2018 в 12:31

Cron использует оболочку для запуска команд. В случае этого пользователя это /bin/sh, поэтому для строки типа:

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

Cron работает:

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

Если набор оболочек был /bin/bash, он будет запускаться :

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

Теперь почему вы не видите процесс bash -c с bash? Bash, когда задана простая простая команда, непосредственно exec использует команду вместо fork ing и 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 +++

С dash, которая является /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 +++

Здесь вы можете увидеть дополнительный клон.

3
ответ дан 24 July 2018 в 19:58

Другие вопросы по тегам:

Похожие вопросы: