Почему 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 не должен показывать его как таковой?

  • Что происходит после kill -CONT <PID>?
  • Как смотреть pgrep?
  • Как убить процессы, если не было превышено ограничение root и ограничение nproc?
  • Как запустить команду на переднем плане, а затем отправить на задний план
  • Возможно определить несуществующий процесс из pgrep
  • Возможно ли объединение двух разных пространств имен процессов?
  • Как получить идентификатор очень короткого дочернего процесса, если родитель известен?
  • Gnu Parallel: более одного процессора?
  • 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 - лучшая ОС в мире.