Сеансы и группы — это не одно и то же. Давайте сделаем вещи чистыми:
Сеанс состоит из одной или нескольких групп процессов и может иметь управляющий терминал. Когда у сеанса есть управляющий терминал, у сеанса в любой момент есть ровно одна группа процессов переднего плана и одна или несколько групп фоновых процессов. В таком сценарии все генерируемые терминалом сигналы и входные данные видны каждому процессу в группе процессов переднего плана.
Кроме того, когда сеанс имеет управляющий терминал, процесс оболочки обычно является лидером сеанса, диктуя, какая группа процессов является группой процессов переднего плана (неявно делая другие группы группами фоновых процессов). Процессы в группе обычно помещаются туда линейным конвейером. Например, ls -l | grep a | sort
обычно создает новую группу процессов, в которой живут ls
, grep
и sort
.
Оболочки, поддерживающие управление заданиями (которое также требует поддержки со стороны ядра и драйвера терминала), как и в случае с bash, создают новую группу процессов для каждой вызываемой команды, и если вы вызываете ее для выполнения в фоновом режиме (с &
), эта группа процессов не получает контроль над терминалом, и оболочка делает ее фоновой группой процессов (а группа процессов переднего плана остается оболочкой).
Итак, как видите, в этом случае вы почти наверняка не захотите создавать сеанс. Типичная ситуация, когда вы хотите создать сеанс, — это демонизация процесса, но кроме этого, создание нового сеанса обычно не имеет особого смысла.
Вы можете запустить скрипт как фоновое задание, как я уже упоминал, это создаст новую группу процессов. Поскольку fork()
наследует идентификатор группы процессов, каждый процесс, выполняемый сценарием, будет находиться в одной группе. Например, рассмотрим этот простой скрипт:
#!/bin/bash
ps -o pid,ppid,pgid,comm | grep ".*"
Это печатает что-то вроде:
PID PPID PGID COMMAND
11888 11885 11888 bash
12343 11888 12343 execute.sh
12344 12343 12343 ps
12345 12343 12343 grep
Как видите, execute.sh
, ps
и grep
находятся в одной группе процессов (значение в PGID
).
Итак, все, что вы хотите, это:
/path/to/myscript &
Затем вы можете проверить идентификатор группы процессов myscript
с помощью ps -o pid,ppid,pgid,comm | grep myscript
. Чтобы отправить сигнал группе, отправьте его лидеру группы (PGID
— это PID
лидера группы). Сигнал, отправленный группе, доставляется каждому процессу в этой группе.
person
Filipe Gonçalves
schedule
10.06.2015