您的位置:知识库 » 开源

将 Perl 脚本从 Solaris 移植到 Linux

作者: Wainer Moschetta  来源: IBM  发布时间: 2010-11-21 21:56  阅读: 1205 次  推荐: 0   原文链接   [收藏]  
摘要:尽管 Perl 语言在各种平台上轻便易移植,但大多数用于系统管理的脚本都利用特定平台资源。Solaris 的脚本可能使用特定 Solaris 路径名和命令,这些可能和 Linux® 上的不一样。本文为您提供一个代码矫正 的路线图,当直接映射不可用时,会帮助您将一个 Perl 脚本从 Solaris 移植到 Linux。

  随着可视化技术的发展,企业逐渐将物理服务器合并到虚拟环境,提高资产管理同时减少能量消耗和物理空间。有些情况下,合并活动涉及到从一个旧操作系统迁移到一个能提供便利的系统管理或其他总拥有成本优势的系统。

  如果您计划从 Solaris 迁移到 Linux,那么几乎您的所有定制代码(包括 C、shell 脚本、Perl,等等)都需要一些矫正 — 一个映射属性的 “再排列” — 因为平台不同。此外,Perl 不同于其他语言 — 尽管程序本身可在各种平台上移植,而且您只需要安装一个解析程序来在目标系统上运行代码 — 但是一些矫正类型的问题仍然可能出现。特定 Solaris 资源 — 最明显的操作系统路径名、系统命令和 Perl 模块 — 通常在代码中受到影响。因此,您应该期待采用某种代码矫正(code remediation)来确保 Perl 脚本在迁移之后正常运行。

  但是什么 Perl 语法结构,哪个操作符最值得关注呢?在本文中,我们将向您介绍最常见的可移植性陷阱,并为您呈现一个将 Perl 脚本从 Solaris 迁移到 Linux 的路线图。您可以使用本文提供的路线图从大多数 Unix 操作系统将 Perl 脚本迁移到 Linux;然而,所有示例、样例代码以及参考资料只关注 Solaris 到 Linux 的迁移。

  Perl 可移植性问题

  您应该检查 Perl 脚本中引用的参考资料,来确保脚本在 Linux 系统中运行时不会出现由特定 Solaris 代码引起的问题。例如,想想从一个仅在 Solaris 上遇到的文件中提取信息的脚本;想像使用一个在 Linux 系统中不可用的标志执行一个系统命令。多数可移植性问题根据他们访问的或引用的系统资源可以被分成 5 类,见表 1 。

表 1. Perl 脚本中可移植性问题的分类

类别可移植性问题
01 特定平台 Perl 模块依赖项
02 操作系统命令和 IPC(进程间通信)
03 使用的操作系统路径名
04 存放特定平台信息的特定变量的使用
05 不同实现或不能跨平台实现的功能

  5 步让 Perl 移植变完美
  让我们来看看将 Perl 脚本从 Solaris 移植到 Linux 的路线图,这个路线图是根据表 1 中的可移植性问题分类构建的。线路图包括 5 个步骤,每一个对应表中的一个类;每步都可以识别需要代码矫正的 Perl 语法结构或操作符问题。
  第 1 步. 检查特定 Solaris 模块依赖项

  第一步都是关于检查导入 Perl 模块的。其中一些专门用于构建 Solaris,一旦您使用了它们,它们就将脚本绑定到 Solaris 平台。我们需要通过脚本代码识别这些模块,弄清楚它们所用的函数和变量,然后进行适当改变,以防将您困于 Perl 脚本不能运行的平台上。

  在 CPAN 库您可以找到一个 特定 Solaris 模块完整列表;它们的名称通常以 Solaris:: 或 Sun:: 开头。您可以使用清单 1 中的脚本识别 Perl 脚本文件和以 “Solaris” 或 “Sun” 开头的导入语句。

清单 1. 如何找到 Solaris 模块导入

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

  您可以修改清单 1 中的代码,使其在 Perl 脚本内更精确地寻找特定 Solaris 模块。例如,您可以将清单 1 中的脚本转换成 Perl,从而利用 PPI 模块 进行解析。模块的使用不在本文范围之内,但是在解析 Perl 代码时,为更精确我们建议使用它。

  在使用特定 Solaris 代码识别脚本之后,您需要搜索可以在 Linux 系统上运行的等价模块。就功能性而言,识别这类模块通常并不那么容易,因为原始模块可能涉及到 Solaris 平台的专有技术。出现这种情况时,您就不得不执行更加深入的分析。要使用一个等价的基于 Linux 的模块,您需要用新模块的等价类替换所有导入语句以及所有称为函数和变量的对象。

  第 2 步. 检查特定 Solaris 系统命令调用

  从 Perl 脚本内调用操作系统命令,在执行从 Solaris 到 Linux 迁移时,可以呈现多数常见问题,原因如下:

  目标系统命令缺乏

  命令有不同的标志集

  命令在两个系统上表现不同

  因此,在处理这些问题时,要特别关注第 2 类可移植性问题:系统调用。这里的目标是确保任何在脚本上按照语法和语义调用的系统命令,在 Linux 上都能正确运行。简而言之,都是关于识别在含有特定 Solaris 系统命令的脚本中使用的 Perl 核心函数和操作符。让我们从一个示例开始。清单 2 是一个用于显示 Solaris 系统内存大小的简单 Perl 脚本。

清单 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 上运行同一个脚本。通过 backtick 操作符,我们断定它调用一个管道系统命令(prtconf | grep Memory),而 prtconf 命令是特定于 Solaris 的。第一步是为它寻找一个代替品。您可以使用 cat /proc/meminfo | grep MemTotal,即使输出的格式不同,因为 /proc/meminfo 保存信息的单位是 KB,而 prtconf 是 MB。

  要矫正这些脚本,您可以使用 cat /proc/meminfo 替换 ptrconf,但将输出信息单位保存为 MB(我们不知道这个脚本的输出是否会用于其他脚本的输入,因此最好不要改变),我们可以使用一个简单的转换。清单 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. 调用系统命令的 Perl 核心函数和操作符

函数/操作符Solaris 中的示例Linux 中的示例
backtick (``) `prstat` `ps -e`
system system("psrinfo") system("cat","/proc/cpuinfo")
exec exec("/usr/sbin/df -kZ") exec("/bin/df -kZ")
qx qx/"metastat"/ qx/"lvdisplay"/
open open DATA, "cat /var/cron/log |" Open DATA, "cat /var/log/cron"
readpipe readpipe( "cat /etc/default/login " ) Readpipe( "cat /etc/default/login" )

  第 3 步. 检查 OS 路径名的使用
  现在,我们来研究通过 Perl 脚本迁移使用的路径名;这一步类似于第 2 步。这里,您需要留意用于打开或操作文件的语法元素和操作符。尽管有特定操作符执行这一任务,但是在引用路径名方面也可能出问题。(当您调用像步骤 2 中提到的那些命令时,您将会看到这些问题)。清单 4 显示了一个小脚本,阅读 Solaris 的 NFS 服务器配置文件并以标准输出打印。

清单 4. 将以标准输出打印文件系统内容的 Perl 脚本

 

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

  当从 Solaris 迁移到 Linux 时,您需要注意系统路径,这常常不同。在本例中,在这个 Solaris 脚本中引用的文件 /etc/default/nfs 在 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 核心变量

变量描述
ENV 含有当前环境变量。其中一些变量可能不支持在 Solaris 和 Linux 之间直接映射,比如 NETPATH、MSGVERB 和 SEV_LEVEL。
SIG 含有信号处理程序。关于在两个平台上发送信号的差异,见 参考资料 部分。

  第 5 步. 识别在各种平台上实现有所不同的函数的使用
  有些核心 Perl 函数要么不能实现,要么在各个平台上的实现都不相同;这些函数在 Solaris 和 Linux 上的表现也不同。您需要修改它们,或者找到 Linux 平台的兼容版本并自然过渡到其中;再一次,查看 Perl Programming Documentation。

  结束语
  识别在从 Solaris 到 Linux(或者, HP/UX 或 AIX 到 Linux)的迁移过程中可能会引起问题的 5 个常见组件并不是很困难。但是进行必要的代码矫正和代码替换来将您的脚本成功地移入 Linux 很费时间,特别是如果您有很多脚本需要迁移。本文的示例和代码矫正会帮您快速上手。祝您好运!

0
0

开源热门文章

    开源最新文章

      最新新闻

        热门新闻