Setsid linux ��� ���

команда setsid в Linux с примерами

Команда setsid в системе Linux используется для запуска программы в новом сеансе. Команда вызовет fork (2), если уже есть лидер группы процессов. Иначе, он выполнит программу в текущем процессе.

Синтаксис:

Пример: он выполнит наш скрипт оболочки в новом сеансе.

Параметры:

    setsid -c: эта опция установит управляющий терминал на текущий.

Пример:

В этом примере наш текущий терминал настроен на управляющий терминал.

setsid -w: эта опция будет ожидать завершения выполнения программы и будет возвращать выходное значение этой программы в качестве возвращаемого значения setsid .

Пример:

В этом примере, если есть какой-либо процесс, который должен занять некоторое время для полного выполнения, то в этом случае он вернет значение выхода.

setsid -V: эта опция покажет информацию о версии и выйдет.

Пример:

setsid -h: эта опция покажет текст справки и завершится.

Источник

setsid command in Linux with Examples

setsid command in Linux system is used to run a program in a new session. The command will call the fork(2) if already a process group leader. Else, it will execute a program in the current process.

Syntax:

Example: It will execute our shell script in a new session.

Options:

Example:

In this example, we have our current terminal set to controlling terminal.
setsid -w: This option will wait for the execution of the program to end and return the exit value of this program as the return value of setsid.

Example:

In this example, if there’s any process which is supposed to take some time to be fully executed then, in that case, it will return the exit value.
setsid -V : This option will show the version information and exit.

Example:


setsid -h : This option will show the help text and exit.

Источник

Читайте также:  Reset defaults windows 10

linux команда setsid

Я пытаюсь написать оболочку, которая будет выполнять сценарий в качестве лидера сеанса. Меня смущает поведение команды linux setsid . Рассмотрим этот скрипт, называемый test.sh :

выход отличается в зависимости от того, выполняется ли он или получен:

Итак, мне кажется, что setsid возвращает немедленно, когда скрипт получен, но он ждет своего ребенка, когда скрипт будет выполнен. Почему наличие управляющего tty иметь какое-либо отношение к setsid ? Спасибо!

Edit: для уточнения я добавил PID/ppid/Sid отчетность ко всем соответствующим командам.

3 ответов

исходный код setsid утилиты на самом деле очень проста. Вы заметите, что это только fork() s, Если он видит, что его идентификатор процесса и идентификатор группы процессов равны (т. е. если он видит, что это лидер группы процессов) — и что он никогда wait() s для дочернего процесса: если это fork() s, затем родительский процесс сразу возвращается. Если это не fork() , то это дает вид wait() ing для ребенка, но на самом деле то, что происходит просто это is ребенок, и это Баш, который wait() ing (как всегда). (Конечно, когда это действительно fork() , Баш не может wait() для ребенка он создает, потому что обрабатывает wait() для их детей, а не для их внуков.)

поэтому поведение, которое вы видите, является прямым следствием другого поведения:

  • при выполнении . ./test.sh или source ./test.sh или что-то еще — или, если на то пошло, когда вы просто запускаете setsid непосредственно из подсказки Bash-Bash запустится setsid с новым процессом-group-ID для Контрольная работа целей, так setsid будет иметь тот же идентификатор процесса, что и его идентификатор группы процессов (то есть это лидер группы процессов), поэтому он будет fork() и не wait() .
  • при выполнении ./test.sh или bash test.sh или что-то еще, и он запускает setsid , setsid будет частью той же группы процессов, что и скрипт, который ее запускает, поэтому его process-ID и process-group-ID будут другой, так что не будет fork() , поэтому это даст видимость ожидания (без фактического wait() ing).

set -x чтобы убедиться, что вы видите вещи правильно?

при работе ./test.sh 1 , родитель скрипта-интерактивная оболочка-является лидером сеанса, поэтому $$ != $SID и условие истинно.

Читайте также:  Zoom не работает микрофон windows

при работе . test.sh 1 , интерактивная оболочка выполняет сценарий в процессе и является собственным лидером сеанса, поэтому $$ == $SID и условное значение равно false, поэтому никогда не выполняется внутренний дочерний сценарий.

Я не вижу никаких проблем с вашим сценарием, как есть. Я добавил дополнительные операторы в ваш код, чтобы увидеть, что происходит:

дело, которое касается вас:

и поверьте мне, запустите этот измененный скрипт, и вы увидите, что именно происходит. Если оболочка, которая не является лидером сеанса, запускает скрипт, то она просто переходит в else заблокировать. Я что-то упускаю?

Источник

setsid (3p) — Linux Man Pages

setsid: create session and set process group ID

Command to display setsid manual in Linux: $ man 3p setsid

PROLOG

setsid — create session and set process group ID

SYNOPSIS


DESCRIPTION

The setsid () function shall create a new session, if the calling process is not a process group leader. Upon return the calling process shall be the session leader of this new session, shall be the process group leader of a new process group, and shall have no controlling terminal. The process group ID of the calling process shall be set equal to the process ID of the calling process. The calling process shall be the only process in the new process group and the only process in the new session.

RETURN VALUE

Upon successful completion, setsid () shall return the value of the new process group ID of the calling process. Otherwise, it shall return ( pid_t )-1 and set errno to indicate the error.

ERRORS

The setsid () function shall fail if: EPERM The calling process is already a process group leader, or the process group ID of a process other than the calling process matches the process ID of the calling process.

The following sections are informative.

EXAMPLES


APPLICATION USAGE


RATIONALE

The setsid () function is similar to the setpgrp () function of System V. System V, without job control, groups processes into process groups and creates new process groups via setpgrp (); only one process group may be part of a login session.

Читайте также:  При установке более ранней версии windows

Job control allows multiple process groups within a login session. In order to limit job control actions so that they can only affect processes in the same login session, this volume of IEEE Std 1003.1-2001 adds the concept of a session that is created via setsid (). The setsid () function also creates the initial process group contained in the session. Additional process groups can be created via the setpgid () function. A System V process group would correspond to a POSIX System Interfaces session containing a single POSIX process group. Note that this function requires that the calling process not be a process group leader. The usual way to ensure this is true is to create a new process with fork () and have it call setsid (). The fork () function guarantees that the process ID of the new process does not match any existing process group ID.

FUTURE DIRECTIONS



SEE ALSO

getsid (), setpgid (), setpgrp (), the Base Definitions volume of IEEE Std 1003.1-2001, ,

Источник

setsid — создает сеанс и устанавливает идентификатор группы

НАЗВАНИЕ
setsid — создает сеанс и устанавливает идентификатор
группы

pid_t setsid(void);

ОПИСАНИЕ

setsid() создает новый сеанс, если вызывающий процесс не
создает группу. Вызывающий процесс становится ведущим в
группе, ведущим процессом нового сеанса и не имеет
контролирующего терминала. Идентификаторы группы процессов
и сеанса при установке будут равными идентификатору
вызывающего процесса. Вызывающий процесс будет
единственным в этой группе и сеансе.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Возвращает идентификатор сеанса вызывающего процесса.

КОДЫ ОШИБОК
При ошибке возвращаемое значение равно -1. Единственная
ошибка, которая может произойти, — это EPERM. Она
происходит, когда идентификатор группы процессов любого
процесса равен идентификатору вызывающего процесса. В этом
случае функция setsid не может быть выполнене, так как
процесс уже является ведущим в группе.

ЗАМЕЧАНИЯ

Создающий группу процесс («лидер») — это процесс,
идентификатор группы процессов которого равен
идентификатору самого процесса. Для того, чтобы
удостовериться, что функция setsid выполнена, создайте
дочерний процесс при помощи команды fork и выйдите из
процесса, затем в дочернем процессе сделайте вызов set-
sid().

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX, SVr4.

Источник

Оцените статью