Различия между оболочками связаны с различиями в настройке процессов. dash
устанавливает перенаправления перед разветвлением, поэтому /proc/self
указывает на оболочку; bash
и zsh
установили их после разветвления, поэтому /proc/self
указывает на новый процесс. Вы можете увидеть, как это происходит сstrace -f
:
strace -f dash -c '/bin/cat /proc/self/comm - среди прочего показывает ()
open("/proc/self/comm", O_RDONLY) = 3
fcntl(0, F_DUPFD, 10) = 10
close(0) = 0
fcntl(10, F_SETFD, FD_CLOEXEC) = 0
dup2(3, 0) = 0
close(3) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f12581299d0) = 7743
strace: Process 7743 attached
[pid 7742] wait4(-1,
[pid 7743] execve("/bin/cat", ["/bin/cat", "/proc/self/comm", "-"], [/* 43 vars */]) = 0
(/proc/self/comm
открывается перед системным вызовом clone
, в котором процесс разветвляется );
strace -f bash -c '/bin/cat /proc/self/comm - показывает
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb506bdee10) = 8106
strace: Process 8106 attached
[... snip a ton of signal-handling setup...]
[pid 8106] open("/proc/self/comm", O_RDONLY) = 3
[pid 8106] dup2(3, 0) = 0
[pid 8106] close(3) = 0
[pid 8106] execve("/bin/cat", ["/bin/cat", "/proc/self/comm", "-"], [/* 43 vars */]) = 0
(/proc/self/comm
открывается после вызова clone
,в дочернем процессе 8106 ).
Понимание того, почему environ
отображается пустым, требует дополнительных объяснений. Когда /proc/
открывается , ядро сохраняет копию указателя на задачу mm_struct
, которая содержит указатели на среду. Но execve
, который используется для запуска процесса cat
, создает новый mm_struct
для процесса . Таким образом, перенаправление в конечном итоге указывает на устаревшую информацию, и когда cat
считывает свой ввод, он не видит своего реального окружения. Среда, которую он видит , должна быть копией родительской, но вовлеченные оболочки очищают ее перед разветвлением и настройкой новой среды (, которая устанавливаетсяexecve
).
В RHEL 8 вы можете использовать syspurpose
для определения настроенной цели системы, , например.
$ sudo syspurpose show
{
"role": "Red Hat Enterprise Linux Workstation",
"usage": "Production"
}
Однако настраивать это необязательно. Чтобы настроить назначение системы, запустите
sudo syspurpose --set-role="Red Hat Enterprise Linux Server"
(роль может быть одной из «Red Hat Enterprise Linux Server», «Red Hat Enterprise Linux Workstation», «Red Hat Enterprise Linux Compute Node»).
Если вас интересует тип подписки, который используется в системе, запустите
sudo subscription-manager list --consumed | grep "Roles:"
Это будет указывать роль системы как подписанной.
Вы можете использовать subscription-manager list --consumed
для просмотра подписки, прикрепленной к вашей системе. В выводе этой команды у вас будет строка, начинающаяся с Имя подписки:. Эта строка сообщит вам, какую подписку использует ваша система.Однако это не является гарантией того, что ваша система действительно относится к типу, указанному в подписке.