perl: запустить процесс с помощью system (), а затем проверить, работает ли он под определенным номером дисплея - PullRequest
0 голосов
/ 13 ноября 2010

У меня заблокирован терминальный сервер "киоск".

Этот терминальный сервер имеет скрипт Perl в качестве .Xsession и запускает интерфейс Tk. Когда этот интерфейс Tk готов, скрипт perl запускает «process2» и позволяет пользователю взаимодействовать с «process2» (графическим приложением).

Если пользователь вмешивается в «process2» и вызывает его сбой, пользователь может получить доступ к базовому рабочему столу, поэтому я хотел бы проверить, запущен ли «process2» и не запущен ли «process2» $ display, я хотел бы просто выполнить выход из системы (что приведет к выходу из системы отображения экрана, на котором в настоящий момент выполняется скрипт perl).

Поскольку система одновременно запускает 10 экземпляров «process2» для 10 разных пользователей, я не могу просто проверить, запущен ли «process2» в системе с «ps» или что-то в этом роде. Мне нужно проверить, запущен ли «process2» под этим конкретным дисплеем $ display. Обратите внимание, что все 10 пользователей входят в систему под одним и тем же именем пользователя во всех сеансах, поэтому я не могу проверить все процессы, запущенные конкретным пользователем, которые также будут возвращать все 10 экземпляров.

Как:

system("process2 &");
while(1) {
  sleep(1);
  if (is_it_running("process2", $display) == false) {
    system("logout &");
  }
}

Это функция is_it_running, которая мне нужна, чтобы узнать, как она должна выглядеть. $ display может содержать необработанный номер дисплея, например: «: 1.0», или может содержать разобранный номер дисплея, например: «1».

Ответы [ 3 ]

3 голосов
/ 13 ноября 2010

Если вы используете fork и exec вместо system("...&"), вы можете хранить идентификаторы процессов ваших дочерних процессов и более непосредственно проверять их состояние. Смотрите также perlipc .

1 голос
/ 13 ноября 2010

Почему бы просто не запустить process2 на переднем плане? Тогда ваш Perl-скрипт не вернет управление, пока не завершит выполнение, после чего он может выйти:

system("process2");
system("logout");

Конечно, если это весь сценарий, возможно, сценарий bash будет иметь больше смысла.

0 голосов
/ 15 ноября 2010

Я решил это после многих попыток.

Открыл ли трубопровод

$pidofcall = open(HANDLE, "process2|");

Затем я сделал все, что мне нужно, и заставил сервер отправить мне сигналон теряет связь с процессом2.Если мне нужно было сразиться, я просто сделал «goto killprocess»;Тогда у меня просто было:

killprocess:
kill(9,$pidofcall);
close(HANDLE);
$mw->destroy;
system("logout");
...