Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > console vs process


Автор: BitCat 10.7.2006, 16:26
Есть скрипт x.pl.
Нужно сделать такую вещь:
+)если этот x.pl запускался с консоли терминала (./x.pl), то выдать на экран 'TERMINAL'
+)если x.pl запускался из другого скрипта-процесса, то на консоль ничего выдавать не надо.

Вопрос: как узнать, откуда запущен скрипт - из консоли или из левого процесса через какой-нить exec/system/`` ? 

Автор: sharq 11.7.2006, 11:38
BitCat, скрипту все равно кто его запустил на выполнение.
Если тебе это так важно могу посоветовать, в каком-нить случае передавать через @ARGV откуда он был запущен и анализировать это.

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

 smile  

Автор: BitCat 11.7.2006, 13:54
 smile 
Код

sub IsTerminalRun()
{
    # extracting script name
    my @path = split(/\//, $0);
    my $env0 = $path[@path-1];
    @path = split(/\//, $ENV{'_'});
    my $env_ = $path[@path-1];
    ($env0 eq $env_) ? return 1 : return 0;
}

на Solaris пашет.

под Redhat и FreeBSD - неа.. да и вообще ключ $ENV{'_'} какой-то очень специфический.
в общем жутко не переносимое решение.

до другого пока не додумался... млин.. 

Автор: DiverD 11.7.2006, 20:27
Цитата(sharq @ 11.7.2006,  11:38)
Хотя если это дочерний процесс, то через вызов системной утилиты (ps) можно узнать кто его вызвал, но это сложно и не нужно  smile 

А почему сложно? вот :
ps aux|grep name_script
 

Автор: BitCat 12.7.2006, 09:40
> через вызов системной утилиты (ps) можно узнать кто его вызвал
Не сложно вызвать системную утилиту и распарсить её ответ, но всегда следует избегать вызова подобных вещей. Зачем вызывать внешнюю прогу, если можно написать это самому, без привязки к какой-либо утилите и ее ответу (мало ли что там дальше разработчики этой тулзы наворотят - может и ответ ее вообще не такой будет, а может из поставки ее исключат).

В общем, вот такая получилась функция:
Код

# returns true if script has been run from console otherwise returns false
# this function works correctly only if parent process started this process with backticks operator
sub IsTerminalRun()
{
    (-t STDOUT) ? return 1 : return 0;
} 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)