2012-01-09 2 views
1

Есть ли способ заставить экран повторить идентификатор сеанса, когда он создает новое окно?Есть ли способ получить экран, чтобы вернуть идентификатор сеанса или pid?

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

+0

Вы говорите о окнах, открытых вашим скриптом или независимо от вашего сценария? – flesk

+0

, открытый моим скриптом, поэтому, если я запустил 'screen -d -m -s server1', я хочу, чтобы экран возвращал мне что-то вроде' 24031', которое было бы pid, даже если бы я мог вернуть его обратно весь идентификатор сеанса как '24031.server1', немного регулярное выражение разрешит это. – ianc1215

ответ

1

Какова ваша цель для сбора этих предметов? Это может быть немного сложно в perl. Что-то вроде Unix :: PID может помочь (http://metacpan.org/pod/Unix::PID), но у меня есть подозрение, что ваш вопрос не затрагивает актуальную проблему, которую вы пытаетесь решить.

Поскольку вы используете screen -dmS <somename> вы можете сделать это:

my %screens; 

for($i = 0; $i < 10; $i++) { 
    system("screen -dmS server$i"); 
} 

open(my $fh, "screen -list|"); 
while (<$fh>){ 
    if (/Detached/) { 
    /\s*(\d*)\.(.*?)\s/; 
    my ($pid, $name) = ($1, $2); 
    $screens{$name} = $pid; 
    } 
}; 
+0

Мне нужны опоры, чтобы определить, на каком экране мне нужно отправлять команды. – ianc1215

+3

, если вы дадите экранам все уникально идентифицируемые имена, вы можете собрать список из списка экранов. – Ilion

+0

Я уже пользуюсь уникальными именами. Причина, по которой мне нужны PID, кроме этого, - это убить экраны, единственный способ, который работает для меня, - убить процесс, который породил мой скрипт. – ianc1215

1

Проверка переменной среды $ENV{'STY'} в любых программах работы внутриscreen.

На моих MacOS X 10.6 системы, по крайней мере, он содержит идентификатор сеанса, например .:

29379.ttys000.hostname 

и где первое поле является ПИД.

От внеscreen, вы можете запустить:

screen -list 

, чтобы получить список всех ваших сессий.

В противном случае, это не ясно, как вы на самом деле, начиная с screen в пределах вашего сценария, но если вы используете стандартную fork/exec модель, то ребенок PID доступен после вызова fork будет искомая PID. См. man perlipc для получения дополнительной информации о том, как развернуть дочернюю программу и взаимодействовать с ней.

+0

В настоящее время я вызываю 'screen' через' system' только потому, что знаю, что он работает. Позже я могу вернуться и использовать что-то лучше. – ianc1215

Смежные вопросы