Как я могу узнать, как был запущен Perl-скрипт? - PullRequest
4 голосов
/ 07 мая 2010

Есть ли способ для Perl-скрипта узнать, кто его вызвал и / или как?

Будь то другой скрипт или исполняемый файл. Прямо из командной строки или cron-планировщика.

Ответы [ 6 ]

16 голосов
/ 07 мая 2010

Инструменты, помогающие отследить, как был запущен Perl-скрипт:

<b><a href="http://search.cpan.org/perldoc/perlfunc#getppid" rel="nofollow noreferrer">getppid</a></b> возвращает идентификатор родительского процесса. Затем вы можете использовать ps или /proc/<pid> для получения дополнительной информации о процессе вызова.

$^X: полный путь к интерпретатору Perl, который может дать представление о том, как Perl был запущен из оболочки

$0, __FILE__: имя сценария, вызванного из командной строки, и имя текущего файла. Если они согласованы, то текущий файл содержит скрипт, который был вызван из командной строки.

@ARGV: аргументы командной строки, переданные в ваш скрипт. С $^X, $0 и @ARGV вы точно знаете , как интерпретатор Perl был запущен из оболочки.

caller: информация трассировки стека. Если caller возвращает undef в начале скрипта, то вы находитесь в верхней части стека, и ваш скрипт был вызван из оболочки. В противном случае caller возвращает пакет, файл и строку, в которой был вызван ваш скрипт (с do или require).

$^T: время (в секундах с начала эпохи), когда был запущен текущий Perl-скрипт, поэтому вы знаете , когда текущий Perl переводчик был запущен из оболочки. Используйте scalar localtime($^T), чтобы увидеть это значение в более удобном формате.

6 голосов
/ 07 мая 2010

Авиатрикс удалил ответ, в котором сказал: «Попробуйте использовать аргументы командной строки».Это хорошая идея.Программы, которые зависят от вещей, которыми невозможно управлять, сложно протестировать.Разрабатывая свой сценарий, действительно ли вы хотите запустить его из cron, чтобы протестировать функциональность «запускается из cron»?Ни за что!

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

Надежное программное обеспечение - это чистая функция от ввода до вывода.Не добавляйте примеси без веской причины.(«Я хочу, чтобы он случайно отличался при запуске из cron» - не веская причина.)

3 голосов
/ 07 мая 2010

В linux вы можете посмотреть /proc/<PID>/ для получения информации, она должна дать вам точную команду, использованную для ее запуска, а также пользователя.

2 голосов
/ 07 мая 2010

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

2 голосов
/ 07 мая 2010

Вы можете использовать CORE::getppid(), чтобы найти идентификатор родительского процесса.

1 голос
/ 07 мая 2010

Как насчет: ps auxww

Там вы увидите имя пользователя + параметры.

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