Прерывание (SIGINT) perl-скрипта из perl-скрипта, работающего под управлением apache

#apache #perl #signals #interrupt

#apache #perl #сигналы #прерывание

Вопрос:

У меня есть скрипт perl, работающий от имени root, который отслеживает последовательное устройство и отправляет на него команды. В apache у меня есть другой perl-скрипт, который отображает графический интерфейс для управляющего «корневого» скрипта.

Я пытаюсь прервать с помощью sigint и sigusr1 корневой perl-скрипт из скрипта perl с графическим интерфейсом, но операция get не разрешена, вероятно, поскольку один является root, а другой нет.

Я в основном хочу, чтобы графический интерфейс мог указывать управляющему корневому скрипту передавать некоторую команду на последовательное устройство.

Если я запускаю скрипт gui из строки cmd как root, он может успешно сигнализировать о корневом скрипте

Я не уверен, куда идти дальше, какие-либо предложения по методам прерывания корневого скрипта, когда он не запускается от имени root? вызов отдельного скрипта «signal», как показано на рисунке:

      @cmds = ("perl /var/www/signal.cgi", "$perlSerialPID", "test");
     if (0 == system(@cmds)) {
         # code if the command runs ok
         print "system call ok: $?";
     } else {
        # code if the command fails
        print "not ok $?";
     }
     # try backticks
     $output = `perl /var/www/signal.cgi $perlSerialPID test`;
     print "<br>:::$output";
 

signal.cgi:

 #!/usr/bin/perl

$pid = $ARGV[0];
$type = $ARGV[1];

if($type eq "test"){
 if(kill 0, $pid) {
   print "perl-serial $pid running!";
 }else{
   print "perl-serial $pid gone $!";
 }
}elsif($type eq "USR1"){
  if(kill USR1, $pid) {
   print "perl-serial interrupted";
  }else{
   print "perl-serial interrupt failed $!";
  }
}else{
  print "FAILED";
} 
 

Комментарии:

1. Создайте скрипт, который отправляет сигнал. Используйте sudo для вызова этого скрипта от имени root.

2. perlmonks.org/?node_id=742855

3. Как упоминалось выше, скрипт gui запускается под управлением apache, как вы затем используете sudo, чтобы вызвать его как root, как вы предлагаете?

Ответ №1:

  1. Используйте именованные каналы для IPC.

    Недостатком является то, что вам придется модифицировать свой основной скрипт для чтения из именованного канала как процесс, управляемый событиями.

  2. Аналогично по концепции описанному выше (с тем же недостатком), но используйте сокеты для связи.
  3. Создайте отдельный скрипт «отправить сигнал», который вызывается через системный вызов из вашего пользовательского интерфейса, и сделайте этот новый скрипт SUID и принадлежащим root — в этом случае он будет выполняться с правами root.

    Недостаток: это созрело для злоупотребления безопасностью, поэтому ужесточите это очень тщательно.

Комментарии:

1. Я попробую небезопасный сценарий-оболочку, поскольку я действительно хочу прерывать, а не опрашивать или проверять файл / канал через регулярные промежутки времени

2. Когда вы говорите sepperate script, вы имели в виду perl-скрипт, поскольку я это сделал, и его операция по-прежнему запрещена. Код, показанный выше

3. В итоге я добавил www-data в sudo и вызвал сценарий signal через ‘sudo perl / path/ to/signal.cgi’, передавая любые команды через сокет UNIX. Прерывание сообщает скрипту считывать и обрабатывать любые cmd’ы, отправленные через сокет, поскольку я не могу блокировать скрипт во время чтения канала.