2016-11-01 3 views
3

Возможно ли остановить повторное использование PID?Bash: Можно ли остановить PID от повторного использования?

Например, если я бегу на работу myjob в фоновом режиме с myjob & и получить PID с помощью PID=$!, можно предотвратить система Linux от повторного использования, что PID, пока я не проверил, что PID больше не существует (процесс закончился)?

Другими словами я хочу сделать что-то вроде:

myjob & 
PID=$! 
do_not_use_this_pid $PID 
wait $PID 
allow_use_of_this_pid $PID 

Причины для желающих сделать это не имеет особого смысла в приведенном выше примере, но рассмотрим запуск нескольких фоновых заданий в серии, а затем ждет для них всех закончить.

Некоторые программисты-чуваки справедливо указывают, что никакие 2 процесса не могут использовать один и тот же PID. Это правильно, но не то, что я прошу здесь. Я прошу о способе предотвращения повторного использования PID после запуска процесса с помощью определенного PID. А затем также метод повторного включения его использования позже, после того как я закончил использовать его, чтобы проверить, закончен ли мой исходный процесс.

Поскольку было просили, вот Прецедент:

  • запуск несколько фоновых заданий
  • получить PID-фоновых заданий
  • предотвратить PID от повторного другим процессом после фона job заканчивается
  • проверить для PID «фоновых заданий» - то есть, чтобы обеспечить завершение фоновых заданий
  • [обратите внимание, если отключено Повторное использование ПИД-адреса для PID-фона фона, на которые не могли быть PID т использоваться новый процесс, который был запущен после того, как фоновый процесс завершается] *
  • повторного включения PID фоновых заданий
  • повтор

* Дальнейшее объяснение:

  • Предположим, 10 рабочих мест начато
  • Работа 5 выходит
  • Новый процесс, инициированный другим пользователем, например, они заходят в tty
  • Новый процесс имеет тот же PID, что и Job 5!
  • Теперь наш скрипт проверяет завершение задания 5, но видит, что PID используется tty!
+0

Ядро уже запрещает это. Ни один из двух процессов не может иметь один и тот же pid. –

+0

@Someprogrammerdude Хорошо, я недостаточно объяснил это, я отредактировал свой вопрос, один секунда – user3728501

+1

Может быть, вы можете добавить прецедент? Расскажите, какую проблему вы пытаетесь решить? Связанные чтения о [проблема XY] (http://xyproblem.info/) –

ответ

1

Если вы не получили возвращаемое значение дочернего процесса, оно будет существовать в ядре. Это также означает, что это pid привязан к нему и не может быть повторно использован в течение этого времени.

6

Вы не можете «заблокировать» PID от повторного использования ядром. Тем не менее, я склонен думать, что это не проблема для вас.

но рассмотрите возможность запуска нескольких фоновых заданий последовательно, а затем ожидающих их завершения.

Простой wait (без аргументов) будет ждать завершения всех дочерних процессов. Таким образом, вам не нужно беспокоиться о повторном использовании PID .

Когда вы запускаете несколько фоновых процессов, действительно возможно, что PID могут повторно использоваться другими процессами. Но это не проблема, потому что вы не можете сделать wait, если это не ваш дочерний процесс.

В противном случае проверка того, что одно из фоновых заданий, которое вы начали, завершено любым способом, кроме wait, всегда будет ненадежным.

+1

Для этого, если вы попытаетесь подождать процесса, который не является * дочерний элемент текущей оболочки 'wait' выводит сообщение об ошибке и выходит со статусом 127. Это не будет статус выхода нормального процесса, позволяя различать ошибку у одного из ваших детей и пытаться подождать готовое задание, идентификатор процесса которого может использоваться в другом месте. – chepner

+0

'wait' имеет точную проблему. Если я запускаю 2 фоновых процесса, я не могу сказать, в каком порядке я должен «ждать», чтобы они закончили.Можно закончить, пока я запускаю команду 'wait' с остальными PID! В этом случае PID готового процесса может быть повторно использован. – user3728501

+0

Идентификаторы процесса: * не менее * 16 бит; вы действительно обеспокоены тем, что ваша машина порождает 60 000 новых процессов за время между завершением одной работы и вызовом 'wait' на другом, возвращающемся? – chepner

0

Далее предложение, чтобы обойти эту проблему - если вы подозреваете, что PID назначается одному из фоновых заданий переназначены, проверить его в ps, чтобы увидеть, если он все еще ваш процесса с вашей исполняемым и имеет PPID (родительский PID) 1.

0

Если вы боитесь повторного PID, который не произойдет, если вы wait другие ответы объяснить, вы можете использовать

echo 4194303 > /proc/sys/kernel/pid_max 

уменьшить свой страх ;-)

+0

Если я ничего не понимаю здесь, если мне нужно «подождать» более 1 PID, тогда возможно, что другой PID будет повторно использоваться в том случае, если команды ожидания закончатся не в порядке – user3728501

Смежные вопросы