Как я могу определить, выполняется ли скрипт в системе или вызовом qx в Perl? - PullRequest
3 голосов
/ 04 июня 2009

Можно ли в Perl определить, выполняется ли сценарий внутри другого сценария (предположительно, через system или qx)?

$ cat foo.pl
print "foo";
print "\n" if not $in_qx;  # or the like.

Я понимаю, что это не применимо, если скрипт запускался через exec.

Я точно знаю, что system запускает процесс как fork, и я знаю, что fork может возвращать значение, которое является переменным, в зависимости от того, являетесь ли вы родительским или дочерним процессом. Не уверен насчет qx.

Несмотря ни на что, я не уверен, как выяснить, если я нахожусь в fork редактируемом процессе, фактически не выполняя fork.

Ответы [ 3 ]

6 голосов
/ 04 июня 2009

Все процессы разветвляются от другого процесса (кроме init). Вы можете определить, была ли программа запущена из open, qx//, open2 или open3, используя функцию isatty из POSIX , но не существует хорошего способа определите, запускаете ли вы system, не глядя на дерево процессов, и даже в этом случае оно может стать мутным (например, system "nohup", "./foo.pl" не будет иметь вызывающий процесс perl в качестве его родителя).

5 голосов
/ 04 июня 2009

Вы можете проверить "кто твой папа", используя "getppid" (получить идентификатор родителя). Затем проверьте, является ли ваш родительский идентификатор сценарием perl с pgrep или аналогичным.

2 голосов
/ 04 июня 2009

Вы контролируете звонящего? Самое простое, что можно сделать, это передать аргумент, например, --isforked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...