Почему Shebang приводит к другому названию процесса, чем явный звонок?

Если не используется X11, то screen позволит вам мультиплексировать терминалы и иметь несколько ssh сессий.

0
25.08.2018, 15:24
2 ответа

I understand that a process can change its own name, but why isn't the name the same in both cases?

Потому что задействованные программы не меняют свои имена. Им присваиваются имена, которые присваивает поведение Linux по умолчанию. (Другие операционные системы ведут себя по-другому, но это вопрос Linux, поскольку он говорит о /proc/*/commфайлах.)

В Linux имя программы в commберется из имени файла образа программы , переданного в execve(). Обратите внимание, что это не является ни вектором-аргументом, ни вектором среды, и утверждение, что это имя взято из вектора-аргумента в Linux, ошибочно.

Имена файлов образа программы, которые на самом деле передает оболочка, — это /usr/bin/pythonи /usr/bin/mirage, поэтому pythonи mirage— это то, чем инициализируется /proc/self/comm.(comm— это базовое имя имени файла образа программы, усеченное/дополненное.)

Вектор аргумента инициализирует то, что процесс имеет в своем /proc/self/cmdline, а вектор окружения инициализирует то, что он имеет в /proc/self/environ. Так что с этими и /proc/self/commи предполагая, что программа не изменяет их во время работы, вы знаете все три фрагмента информации, которые были переданы execve()и, таким образом, точно «как процесс был первоначально запущен» (. ] хотя, строго говоря, так запускалась программа , как запускался процесс сfork()).

Вот пример этих трех частей в действии с использованием clearenv, setenvи execиз набора инструментов Nosh для настройки небольшой среды и силы argv[0]для наглядности:

% clearenv setenv 1THIS 'is the environment string' setenv 2COMPRISING 'all of the environment.' \
> exec -a 'This is argv[0].' /bin/sleep 100 &
[1] 15564
% for i in /proc/$\!/{comm,cmdline,environ} ; do printf "%s:" $i ; cat -v $i ; printf "\n" ; done
/proc/15564/comm:3

/proc/15564/cmdline:This is argv[0].^@100^@
/proc/15564/environ:1THIS=is the environment string^@2COMPRISING=all of the environment.^@
%

И действительно, это именно то, что команда execнабора инструментов nosh передала execve()для запуска /bin/sleep. (3связано с тем, что execиспользует функцию fexecve()библиотеки C, которая внутренне использует имена файлов образов программ в форме /proc/self/fd/3.)

Файл образа программы оказывается сценарием с именованным интерпретатором и #!магическим числом, что приводит к замене этим интерпретатором файла образа программы и смещению вектора аргумента, не изменяется что входит в comm. Остается любое имя файла образа программы, которое изначально было присвоено execve(). Да, Linux здесь непоследователен, потому что он действительно изменяет то, что в таких случаях входит в cmdline, чтобы быть эффективной строкой конечного аргумента.

Дополнительная литература

1
28.01.2020, 02:23

Имя процесса происходит от argv[0]в вызове execv().

Это объясняет поведение, которое вы наблюдаете.

Тот факт, что в случае шебанга ядро ​​перестраивает то, как вещи называются, не влияет на вектор argv.

2
28.01.2020, 02:23

Теги

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