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

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

#!/bin/bash sleep 90 

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

  • Перечислите прямые символические ссылки (ссылки, которые не указывают на другую символическую ссылку)
  • «Incrond dead, но суды закрыты», что это значит?
  • Как отслеживать вывод, когда процесс выполняется на сервере RedHat Linux?
  • Как добавить псевдоним системы?
  • Убейте процесс, начатый execl
  • Как я могу создать цикл for, запускающий множество процессов?
  • Вот что я вижу

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

  • Как полностью отсоединить процесс
  • Как запретить пользователям переименование файлов при предоставлении разрешений на запись в Linux
  • Копирование файлов на основе даты / времени из поднабора каталогов
  • Предотвращение бинарных атак в Linux
  • автоматизация конфигурации CentOS 7 с использованием сценариев оболочки
  • Решение «mv: Список аргументов слишком длинный»?
  • 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 - лучшая ОС в мире.