Почему pstree показывает имя моего скрипта вместо имени интерпретатора оболочки?

Я написал простой сценарий оболочки следующим образом:

#!/bin/bash sleep 90 

После запуска этой оболочки я запускаю pstree в отдельной оболочке, чтобы увидеть структуру дерева процессов.

Вот что я вижу

 -gnome-terminal-+-bash---sleepy.sh---sleep 

Я ожидал, что это будет похоже на

 -gnome-terminal-+-bash---bash---sleep 

Почему сценарий оболочки представлен как процесс pstree? Команда ps правильно показывает команду, выполняемую как

 10150 8771 0 08:13 pts/1 00:00:00 /bin/bash ./sleepy.sh 

Здесь процесс bash и sleepy.sh – его аргумент (это имеет смысл для меня). На мой взгляд, процесс должен быть двоичным исполняемым двоичным кодом исполняемого файла (ELF). Bash – это исполняемый файл ELF, но сценарий оболочки отсутствует, и поэтому я думаю, что pstree не должен показывать его как таковой?

  • Идентификатор родителя-сиротца не равен 1, когда родительский процесс выполняется с терминала GNOME
  • Что такое альтернатива командной строке для поиска текущего использования ЦП, не зависящего от ширины экрана?
  • Почему pidof и pgrep ведут себя по-другому?
  • Длительный R-скрипт автоматически убивается
  • Процесс автоматически запускается не cron
  • Существует ли верхний предел количества процессов зомби, которые вы можете иметь?
  • Разница между процессом в фоновом режиме и демоном
  • Как получить UID и PID
  • One Solution collect form web for “Почему pstree показывает имя моего скрипта вместо имени интерпретатора оболочки?”

    pstree получает имя процесса из /proc/<pid>/stat . Это то, что было дано ядру через первый параметр execve(2) ; см. proc(5) и что именно происходит, когда я запускаю файл в своей оболочке? для деталей. Вы увидите из последнего, что ядро может запускать скрипты оболочки напрямую (и многие другие «двоичные файлы» – см. « Как Mono magical?» ), Но в некоторых случаях оболочка также работает.

    Таким образом, если вы запускаете

     ./sleepy.sh 

    с линией shebang в начале скрипта вы увидите sleepy.sh в pstree , потому что это то, что оболочка запрашивает ядро ​​для запуска. Если вместо этого вы запускаете

     sh ./sleepy.sh 

    вы увидите sh в pstree .

    ps -f или ps upstree -a ) read /proc/<pid>/cmdline вместо этого, чтобы получить командную строку , которая отличается – это параметр argv предоставленный execve вызову execve . При запуске скрипта оболочки с shebang это изменяется, чтобы включить shebang, что, без сомнения, почему в вашем случае ps показывает

     /bin/bash ./sleepy.sh 

    (см. Как программы запускаются для большего количества на этом).

    Linux и Unix - лучшая ОС в мире.