2015-09-28 1 views
1

У меня есть скрипт Perl, выполняющийся как user1. Этот сценарий в основном используется для остановки/запуска или отскока процесса, выполняемого как user2 на RHEL. Теперь stop/start работает, так как я использую warpper user2 для запуска команд stop/start и bounce.sudo to root в середине скрипта

Проблема в том, что этот процесс представляет собой jvm, который обычно занят. Таким образом, остановка/запуск или отскок не будут работать все время, если jvm действительно занят. Поэтому я пытаюсь убить processid, используя kill -9 для более быстрого отскока.

Итак, могу ли я сделать sudo для user2 или root в середине моего скрипта Perl, выполняющегося как user1, чтобы убить -9 процесс.

Я попытался с помощью

su - user2 -c `kill -9 pid`; 
sudo -u user2 -c `kill -9 pid`; 

Так мой сценарий запуска/остановки/отскока работает как user1. Процесс остановки/запуска/отладки выполняется как user2. Я хочу, чтобы мой скрипт Perl убил процесс, если stop/start/bounce занимает больше 30 секунд.

Пожалуйста, помогите.

+1

Как насчет 'system 'sudo -u user2 -c' kill -9 $ pid '"; '? – melpomene

+0

Это похоже на работу, но не может пропустить пароль. Я попробовал вариант -i. – user3164754

+1

Re: «Это похоже на работу, но не может пропустить пароль». Это контролируется редактированием файла конфигурации, созданного командой «visudo». – ikegami

ответ

1

Если вы не можете исправить вашу sudoers файла с visudo, то Ожидать модуль вариант:

#!/usr/bin/perl 

use Expect; 

# Get the password when your program starts 
my $pw = <>; 

# ... do stuff ... 

# use the password when you need it 
my $exp = Expect->spawn("/usr/bin/sudo", "-k", "-u", "user2", "kill", "-9", $pid); 
print("expecting the prompt\n"); 
$exp->expect(undef, "-re", "Password:", sub { print("prompt matched\n"); $exp->send($pw); exp_continue; }); 
$exp->soft_close(); 

Серьезно, хотя, лучше всего поместить соответствующую запись в sudoers.