Перейти к тексту

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Вся введенная информация защищена.

  • Закрыть [x]

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

Вся введенная информация защищена.

  • Закрыть [x]

Перенос сценариев Perl с Solaris на Linux

Руководство по исправлению кода, когда прямой перенос невозможен

Вайнер Мошета, инженер-программист, IBM
Вайнер Мошета (Wainer Moschetta) работает инженером-программистом в Бразильском центре Linux-технологий IBM, где руководит проектом по созданию инструментов для исправления кода при его переносе из операционных систем UNIX на Linux. Его послужной список включает тестирование драйверов устройств на платформе IBM System X, а также разработку и тестирование J2EE-приложений.
Даниэль Барбоза, инженер-программист, IBM
Даниэль Барбоза (Daniel Barboza) работает инженером-программистом в Бразилиьском центре Linux-технологий IBM, где работает над созданием инструментов миграции, включая средства автоматизации и правила перехода с операционных систем UNIX на Linux. Также занимался программированием на Eclipse, программированием для мобильных устройств на платформе System X и имеет степень магистра технологии мобильных сетей.

Описание:  Язык Perl допускает перенос между платформами, однако в большинстве сценариев, применяемых для системного администрирования, используются ресурсы, зависящие от платформы. К тому же в сценариях, предназначенных для Solaris, могут содержаться специфические для Solaris пути и системные команды, не имеющие эквивалентов на Linux®. Эта статья помогает исправить код, чтобы сценарии Perl можно было перенести с Solaris на Linux, когда прямое отображение не работает.

Дата:  25.04.2011
Уровень сложности:  средний PDF:  A4 and Letter (39KB | 9 страница)Загрузить Adobe® Reader®
Активность:  3687 просмотров
Комментарии:  


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

При планировании перехода с Solaris на Linux из-за различий в этих платформах почти весь специализированный код (в том числе код C, сценарии оболочки, Perl и т.д.) придется как-то исправить – "перестроить" отображения атрибутов.

Более того, как и в случае других языков, со сценариями Perl могут возникать проблемы, требующие исправления – хотя сама программа перемещаема между платформами, и нужно просто установить интерпретатор для выполнения кода на целевой системе. В коде часто используются специфические для Solaris ресурсы, в первую очередь пути операционной системы, системные команды и модули Perl. Поэтому для того чтобы сценарии Perl работали после миграции, потребуется некоторое изменение кода.

Но на какие синтаксические конструкции и операторы Perl следует обращать наибольшее внимание? В этой статье мы рассматриваем самые распространенные проблемы переносимости и предлагаем план переноса сценариев Perl с Solaris на Linux. Этот план можно использовать для миграции на Linux с большинства операционных систем UNIX (включая AIX, HP/UX и т.д.), однако все примеры, образцы кода и справки приведены для миграции Solaris-Linux.

Проблемы переносимости Perl

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

Большинство проблем переносимости можно разделить на пять классов в зависимости от системных ресурсов, к которым они обращаются или на которые ссылаются, как указано в таблице 1.


Таблица 1. Классы проблем переносимости сценариев Perl
КлассПроблема переносимости
01Зависимость от специфических для платформы модулей Perl
02Команды операционной системы и IPC
03Используемые пути операционной системы
04Специальные переменные, содержащие специфическую для платформы информацию
05Функции, которые реализуются по-разному или не реализуются на разных платформах

Классы, перечисленные в таблице 1, ― список не всех проблем переносимости, а лишь наиболее распространенных из них. За более подробной информацией о проблемах переносимости обращайтесь к документации по программированию на Perl (см. раздел Ресурсы).


Пять шагов к идеальному переносу Perl

Рассмотрим план переноса сценариев Perl с Solaris на Linux. Этот план основан на классах проблем переносимости из таблицы 1. План включает в себя пять этапов, каждый из которых сфокусирован на одном из классов из таблицы 1. Каждый шаг указывает на проблемы синтаксических конструкций или операторов Perl, для решения которых может потребоваться внесение некоторых исправлений.

Шаг 1. Проверка зависимости от специфических для Solaris модулей

Этот первый шаг относится к проверке импортированных модулей Perl. Некоторые из них специально созданы для Solaris и "привязывают" сценарий к платформе Solaris. Нужно уметь выявить эти модули по коду сценария, выяснить, какие функции и переменные они используют, и внести соответствующие изменения.

Полный список специфических для Solaris модулей можно найти в хранилище CPAN ― их имена обычно начинаются с Solaris:: или Sun::Solaris::.

Для выявления файлов сценариев Perl с импортированными операторами, которые начинаются с Solaris или Sun, можно использовать сценарий оболочки, приведенный в листинге 1.


Листинг 1. Поиск импортированных модулей Solaris

#!/bin/bash
find . -name "*.pl" -exec grep -ilP "^\s*use (Solaris|Sun)" {} \;

Код из листинга 1 можно изменить так, чтобы этот сценарий точнее определял специфические для Solaris модули сценариев Perl. Например, можно преобразовать сценарий оболочки из листинга 1 в сценарий Perl и использовать для синтаксического разбора модуль PPI. Использование этого модуля выходит за рамки данной статьи, но мы рекомендуем его для повышения точности при анализе кодов Perl.

Выявив сценарии со специфическим для Solaris кодом, нужно найти эквивалентные модули, которые работают на Linux. Такие модули не всегда легко определить с точки зрения функциональности, так как оригинальные модули могли иметь дело с технологиями, работающими исключительно на платформе Solaris. В таких случаях придется выполнить более глубокий анализ.

Для использования эквивалентных Linux-модулей необходимо заменить все операторы импорта, а также любые вызываемые функции и переменные их эквивалентами для нового модуля.

Шаг 2. Проверка на вызовы системных команд Solaris

Вызов команд операционной системы из сценария Perl ― наиболее распространенная проблема при миграции с Solaris на Linux по нескольким причинам:

  • отсутствие команды на целевой системе;
  • команды с другими наборами флагов;
  • команды, которые по-разному ведут себя на каждой из платформ.

Таким образом, при рассмотрении данного вопроса необходимо уделить особое внимание классу переносимости 02: системным вызовам.

Цель здесь заключается в том, чтобы любая системная команда, вызываемая сценарием, синтаксически и семантически правильно работала на Linux. Короче говоря, нужно выявить основные функции и операторы Perl, используемые в сценарии, которые выполняют специфические для Solaris системные команды.

Приведем пример. В листинге 2 показан простой сценарий Perl, используемый для отображения объема памяти системы Solaris.


Листинг 2. Сценарий Perl для отображения размера системной памяти

#!/usr/bin/perl 
my $mem_info = `prtconf | grep Memory`; 
my (undef, $mem_size) = split(':', $mem_info); 
($mem_size, undef) = split(' ', $mem_size); 
print "Memory size is: ".$mem_size."\n"; 

Теперь предположим, что мы хотим запустить тот же сценарий на Linux. Мы знаем, что он вызывает конвейерную системную команду (prtconf | grep Memory) посредством оператора backtick, и что команда prtconf ― специфическая для Solaris. Первый шаг состоит в поиске замены.

Можно использовать команду cat /proc/meminfo | grep MemTotal, но ее выход форматируется иначе, так как /proc/meminfo выдает информацию о размере в килобайтах, а prtconf ― в мегабайтах.

Для исправления этого сценария можно заменить ptrconf на cat /proc/meminfo, но сохранить выходную информацию в мегабайтах (выходная информация этого сценария может использоваться в качестве входных данных другими сценариями, поэтому очень важно, чтобы это не изменилось). В листинге 3 приведен пример измененного сценария.


Листинг 3. Исправленный сценарий из листинга 2

#!/usr/bin/perl 
my $mem_info = `cat /proc/meminfo | grep MemTotal`; 
my (undef, $mem_size) = split(':', $mem_info); 
($mem_size, undef) = split(' ', $mem_size); 
$mem_size = int($mem_size / 1000); 
print "Memory size is: ".$mem_size."\n"; 

Perl достаточно гибок, чтобы учитывать различные способы выполнения команд операционной системы, и существует множество функций и операторов, которые можно использовать для этой цели. В таблице 2 приведены основные функции и операторы Perl для вызова системных команд из сценария Perl.


Таблица 2. Основные функции и операторы, используемые для вызова системных команд
Функция/операторПример в SolarisПример в Linux
backtick (``)`prstat``ps -e`
systemsystem("psrinfo")system("cat","/proc/cpuinfo")
execexec("/usr/sbin/df -kZ")exec("/bin/df -kZ")
qxqx/"metastat"/qx/"lvdisplay"/
openopen DATA, "cat /var/cron/log |"Open DATA, "cat /var/log/cron"
readpipereadpipe( "cat /etc/default/login " )Readpipe( "cat /etc/default/login" )

За дополнительной информации об этих, а также любых других функциях и операторах, которые не являются частью основного языка Perl, обращайтесь к документации по Perl. Подробные сведения о различиях в командах системного администрирования содержатся в документе IBM Redbook Solaris to Linux Migration: A guide for system administrators [Миграция с Solaris на Linux: руководство для системных администраторов].

Шаг 3. Проверка используемых путей ОС

Теперь поговорим о переносе путей, используемых сценарием Perl; этот шаг аналогичен шагу 2. Здесь нужно обратить внимание на синтаксические элементы и операторы, которые используются для открытия файлов или манипулирования ими. Хотя для этого существуют специальные операторы, могут возникнуть некоторые проблемы с указанием пути. (За этим можно проследить и на шаге 2 при анализе вызываемых системных команд.)

В листинге 4 показан небольшой сценарий, который считывает файл config сервера NFS в Solaris и выводит его на стандартное устройство вывода.


Листинг 4. Сценарий Perl, который распечатывает содержимое системного файла на стандартном устройстве вывода

#!/usr/bin/perl 
open(NFSCONF, '/etc/default/nfs'); 
print <NFSCONF>; 
close(NFSCONF);

При переходе с Solaris на Linux необходимо обратить внимание на системные пути, которые часто не совпадают. В данном примере файл /etc/default/nfs, указанный в этом сценарии для Solaris, в дистрибутиве Linux/Red Hat отсутствует, но его можно заменить на /etc/sysconfig/nfs. В листинге 5 показан исправленный сценарий.


Листинг 5. Исправленный сценарий из листинга 4

#!/usr/bin/perl 
open(NFSCONF, '/etc/sysconfig/nfs'); 
print <NFSCONF>; 
close(NFSCONF);

Нужно знать все команды Perl для управления файлами. В таблице 3 приведены некоторые наиболее часто встречающиеся команды Perl, манипулирующие путями; если любая из них используются в сценарии, при миграции эти пути придется изменить.


Таблица 3. Общеупотребительные команды Perl, использующие путь
КомандаОписание
chdirИзменяет рабочий каталог.
chmodИзменяет разрешение для списка файлов.
globВозвращает список расширений имен файлов (возможно, пустой).
linkСоздает новое имя файла, связанное со старым.
mkdirСоздает новый каталог.
openОткрывает файл.
opendirОткрывает каталог.
renameИзменяет имя файла.
rmdirУдаляет указанный каталог.
sysopenОткрывает указанный файл и связывает его с указанным дескриптором файла.

Шаг 4. Проверка использования специальных переменных, которые содержат специфическую для Solaris информацию

Некоторые специальные переменные содержат информацию об окружении, которая может быть специфической для Solaris; необходимо определить эти переменные и выполнить правильный перевод. В таблице 4 приведены несколько основных переменных, которые могут содержать специфическую для Solaris информацию или ссылки.


Таблица 4. Некоторые основные переменные Perl; список всех переменных см. в документации по программированию на Perl
ПеременнаяОписание
ENVСодержит текущие переменные окружения. Некоторые из этих переменных не обеспечивают прямого соответствия между Solaris и Linux. Примером могут служить переменные NETPATH, MSGVERB и SEV_LEVEL.
SIGСодержит обработчики сигналов. См. раздел Ресурсы, где указана дополнительная информация о различиях в сигнализации на обеих платформах.

Шаг 5. Функции, которые реализуются по-разному или не реализуются на разных платформах.

Некоторые основные функции Perl либо не реализованы на других платформах, либо реализованы по-разному; на Solaris эти функции будут вести и себя иначе, чем на Linux. Их нужно изменить их или найти дополняющую версию для платформы Linux и приспособить ее; опять же, обращайтесь к документации по программированию на Perl (см. ссылки в разделе Ресурсы).


Заключение

Определить пять групп наиболее распространенных компонентов сценариев Perl, которые могут вызвать проблемы при переходе с Solaris на Linux (или с HP/UX и AIX на Linux), не так уж трудно. Но на внесение необходимых изменений в код, которые позволят успешно перенести сценарии на Linux, может уйти много времени, особенно при большом количестве таких сценариев. Советы и примеры по исправлению кода, приведенные в этой статье, помогут взяться за эту работу. Удачи!


Ресурсы

Научиться

Получить продукты и технологии

  • Оцените продукты IBM самым подходящим для себя способом: загрузите ознакомительную версию, попробуйте поработать в онлайне, используйте продукт в облачной среде или проведите несколько часов в песочнице SOA, чтобы научиться эффективно воплощать сервис-ориентированную архитектуру.

Обсудить

  • Примите участие в жизни сообщества My developerWorks. Поддерживайте связь с другими пользователями DeveloperWorks, читая блоги, форумы, группы и вики, которые ведут разработчики.

Об авторах

Вайнер Мошета (Wainer Moschetta) работает инженером-программистом в Бразильском центре Linux-технологий IBM, где руководит проектом по созданию инструментов для исправления кода при его переносе из операционных систем UNIX на Linux. Его послужной список включает тестирование драйверов устройств на платформе IBM System X, а также разработку и тестирование J2EE-приложений.

Даниэль Барбоза (Daniel Barboza) работает инженером-программистом в Бразилиьском центре Linux-технологий IBM, где работает над созданием инструментов миграции, включая средства автоматизации и правила перехода с операционных систем UNIX на Linux. Также занимался программированием на Eclipse, программированием для мобильных устройств на платформе System X и имеет степень магистра технологии мобильных сетей.

Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Спасибо. Эта запись была помечена для модератора.


Помощь по сообщениям о нарушениях

Сообщение о нарушениях

Сообщение о нарушении не было отправлено. Попробуйте, пожалуйста, позже.


developerWorks: вход


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


При первом входе в developerWorks для Вас будет создан профиль. Выберите информацию отображаемую в Вашем профиле — скрыть или отобразить поля можно в любой момент.

Выберите ваше отображаемое имя

При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

(Должно содержать от 3 до 31 символа.)


Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Оценить эту статью

Комментарии

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=650542
ArticleTitle=Перенос сценариев Perl с Solaris на Linux
publish-date=04252011
author1-email=wainersm@br.ibm.com
author1-email-cc=
author2-email=danielhb@br.ibm.com
author2-email-cc=

Теги

Help
Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Используйте ползунок, чтобы отразить больше или меньше тегов.

КнопкаПопулярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere).

Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).

Используйте форму поиска, чтобы найти любой контент с данным тегом в My developerWorks. Кнопка Популярные теги отображает самые распространенные теги для данной области контента (например: Java, Linux, WebSphere). Кнопка Мои теги отображает Ваши теги для данной области контента (например: Java, Linux, WebSphere).