Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > паралельно 2 скрипта


Автор: gcc 23.8.2008, 13:00
есть скрипт от пользователя, нужно запустить еще один от root пользователя, чтобы он выполнял сразу то, что ему перададут!!

нужно тут использовать cron, но а можно чтобы один скрипт слушал, то что ему передадут и сразу выполнял это независимо от первого, как это сделать? через СУБД он должен "слушать"?

или как это сделать?


Автор: FooBar 23.8.2008, 13:16
gcc, вы имеете ввиду межпроцессовое взаимодействие?
если так то посмотрите вот тут: http://gelin.ru/text/trans/perl-ipc/

Автор: sir_nuf_nuf 23.8.2008, 20:15
gcc, не понятно что вы хотите сделать...
Полагаю, можно создать второй скрипт, сохранить его в файле, так что бы root был владельцем,
и поставить на него suid бит.

Первый скрипт будет вызывать второй, второй будет запускаться с правами root и делать  что ему передали, например через аргументы @ARGV командной строки.

Посмотри как сделана комманда оформлена программа su
Код

ls -la /bin/su



вообще это довольно опасно запускать скрипты от рута, которые "делаю то что им передают"
обязательно делайте какую - то проверку прав, например как su - запрашивает пароль, иначе 
будут БОЛЬШИЕ проблемы  smile   

Автор: gcc 24.8.2008, 08:03
FooBar, я поичтал, но не понял, например нужно передать переменную $saa, то как ее передать?


sir_nuf_nuf, да, можно sudo или su, но это получиться что я запущу его один скрипт просто, если я хочу сделать несколько функций, например, system(sudo cp 1 2); и если пользователь нажмет в браузере "stop" то эти функции может не выполниться, трансакицю тут можно сделать, навреное нет... делаю через cron, но а можно сразу сделать, то есть чтобы в другой скрипт можно было передать на ходу...?

кстате, а system("exec sudo cp 1 1"); должен запуститься отдельно?

Автор: FooBar 24.8.2008, 08:50
gcc, по вашему первому посту я так понял что вы хотите передавать параметры скрипту который работает как демон, в таком случае можно было бы использовать для передачи параметров pipe, sysV ipc, unix sockets.
а чтобы стоп не убивало процесс можно например fork'нутся и в потомке обработать то что нужно
system('someprog > /dev/null &'); - запустит в фоне

Автор: gcc 1.9.2008, 19:31
FooBar, спасибо сделал - работает!

я уже написал, исправляю ошибки...

извените, один вопрос не совсем понял, если будут передавать данные через клиент-сервер или через cron, и там же выполняться функция system(), и если где-то будет фатальная ошибка или сервер перезагрузиться, то как лучше сделать "трансакцию" при выполение system() ? smile просто потом нужно будет искать ошибку долго...

Автор: gcc 2.9.2008, 23:28
по-моиму я нашел, елси это оно ...   

 
Код

  package User;

        @ISA = qw(Object::Transaction);

        use Object::Transaction;

        my $top = "/some/path";

        sub new { 
                my ($package, $login) = @_;
                die unless getpwnam($login);
                return bless { UID => getpwnam($login) };
        }

        sub file { 
                my ($ref, $id) = @_;
                $id = $ref->id() unless $id;
                return "$top/users/$id/data.storable";
        }

        sub id {
                my ($this) = @_;
                return $this->{UID};
        }

        sub preload
        {
                my ($id) = @_;
                return if getpwuid($id);
                return getpwnam($id) if getpwnam($id);
                die;
        }

        sub postload
        {
                my ($this) = @_;
                my ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,
                        $shell,$expire) = getpwuid($this->{UID});
                $this->{SHELL} = $shell;
        }

        sub presave
        {
                my ($this, $old) = @_;
                my $id = $this->{UID};
                mkdir("$top/users/$id", 0700);
                delete $this->{SHELL};
        }

        sub postsave
        {
                goto &postload;
        }

        sub postremove
        {
                delete from pw file...
        }

        my $joe = new User "joe";
        $joe->savelater();

        my $fred = new User "fred";
        $fred->savelater();

        $joe->commit();


http://search.cpan.org/~muir/Object-Transaction-1.01/Transaction.pod

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