准备好一个简单的perl脚本文件
把在windows下使用命令行方式查看系统进程信息输出到一个日志文件中
这里简单编写一个perl脚本文件test.pl,内容如下
#!/usr/bin/perl
#作用:在指定目录下生成日志文件,同时每隔1秒输出一次信息,执行到40次后退出
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
$year+=1900;
$mday = ($mday < 10)? "0$mday":$mday;
$mon = ($mon < 9)? "0".($mon+1):($mon+1);
$hour = ($hour < 10)? "0$hour":$hour;
$min = ($min < 10)? "0$min":$min;
$sec = ($sec < 10)? "0$sec":$sec;
open(STDOUT, "> C:\\perltest\\testperl${year}${mon}${mday}_${hour}${min}${sec}.LOG");
if( $#ARGV < 0 ){
print "没有输入参数,请重新输入参数,程序退出\n";
}else{
$i=0;
while (1) {
if($i==40){
last;
}
print "i = $i \n";
sleep(1);
$i++
}
}
exit;
编写java程序调用,同时也输出命令行任务下的进程信息
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PerlMutilProcessTest {
private static Logger logger = LoggerFactory.getLogger(PerlMutilProcessTest.class);
public static void asyncExecutePerl(String perlFullFileName,String [] perlParameters)throws IOException{
Runtime objRunTime = Runtime.getRuntime();
String[] perlParam = null;
if(perlParameters!=null && perlParameters.length > 0){
perlParam =new String[perlParameters.length+2];
perlParam[0]="perl";
perlParam[1]=perlFullFileName;
for(int i=0;i<perlParameters.length;i++){
perlParam[i+2]=perlParameters[i];
}
}else{
perlParam =new String[2];
perlParam[0]="perl";
perlParam[1]=perlFullFileName;
}
StringBuffer perlCmdStr = new StringBuffer();
for(int j=0;j<perlParam.length;j++){
logger.debug("NO. {} perl argument {}",j, perlParam[j]);
perlCmdStr.append(perlParam[j]).append(" ");
}
logger.debug("start exec");
logger.debug(perlCmdStr.toString());
objRunTime.exec(perlCmdStr.toString());
logger.debug("end exec");
}
public static void syncExecutePerl(String perlFullFileName,String [] perlParameters,String outputInfoFileName,String outputErrorFileName)throws IOException,InterruptedException{
Runtime objRunTime = Runtime.getRuntime();
String[] perlParam = null;
if(perlParameters!=null && perlParameters.length > 0){
perlParam =new String[perlParameters.length+2];
perlParam[0]="perl";
perlParam[1]=perlFullFileName;
for(int i=0;i<perlParameters.length;i++){
perlParam[i+2]=perlParameters[i];
}
}else{
perlParam =new String[2];
perlParam[0]="perl";
perlParam[1]=perlFullFileName;
}
StringBuffer perlCmdStr = new StringBuffer();
for(int j=0;j<perlParam.length;j++){
logger.debug("NO. {} perl argument {}",j, perlParam[j]);
perlCmdStr.append(perlParam[j]).append(" ");
}
logger.debug("start exec");
logger.debug(perlCmdStr.toString());
Process perlProcess = objRunTime.exec(perlCmdStr.toString());
FileOutputStream redirectOutputFile = null;
FileOutputStream errorOutputFile = null;
InputStream errorInputStream = null;
InputStream infoInputStream = null;
try{
errorOutputFile = new FileOutputStream(outputErrorFileName);
redirectOutputFile = new FileOutputStream(outputInfoFileName);
errorInputStream = perlProcess.getErrorStream();
infoInputStream = perlProcess.getInputStream();
ProcessInfo errorPerlProcessInfo = new ProcessInfo(errorInputStream,ProcessInfo.TYPE_ERROR,errorOutputFile);
ProcessInfo outputPerlProcessInfo = new ProcessInfo(infoInputStream,ProcessInfo.TYPE_OUTPUT, redirectOutputFile);
errorPerlProcessInfo.redirect();
outputPerlProcessInfo.redirect();
int exitVal = perlProcess.waitFor();
logger.debug("ExitValue: " + exitVal);
errorOutputFile.flush();
redirectOutputFile.flush();
}catch(IOException ioe){
if(redirectOutputFile!=null){
redirectOutputFile.close();
}
if(errorOutputFile!=null){
errorOutputFile.close();
}
if(errorInputStream!=null){
errorInputStream.close();
}
if(infoInputStream!=null){
infoInputStream.close();
}
throw ioe;
}catch(InterruptedException ie){
if(redirectOutputFile!=null){
redirectOutputFile.close();
}
if(errorOutputFile!=null){
errorOutputFile.close();
}
if(errorInputStream!=null){
errorInputStream.close();
}
if(infoInputStream!=null){
infoInputStream.close();
}
throw ie;
}finally{
if(redirectOutputFile!=null){
redirectOutputFile.close();
}
if(errorOutputFile!=null){
errorOutputFile.close();
}
if(errorInputStream!=null){
errorInputStream.close();
}
if(infoInputStream!=null){
infoInputStream.close();
}
}
logger.debug("end exec");
}
public static void syncExecuteSyscmd(String[] syscmdParameters,String outputInfoFileName)throws IOException,InterruptedException{
if(syscmdParameters==null||syscmdParameters.length==0){
return;
}
StringBuffer syscmdStr = new StringBuffer();
for(int j=0;j<syscmdParameters.length;j++){
logger.debug("NO. {} syscmd argument {}",j, syscmdParameters[j]);
syscmdStr.append(syscmdParameters[j]).append(" ");
}
logger.debug("start exec");
logger.debug(syscmdStr.toString());
Process syscmdProcess = Runtime.getRuntime().exec(syscmdStr.toString());
FileOutputStream redirectOutputFile = null;
InputStream infoInputStream = null;
try{
infoInputStream = syscmdProcess.getInputStream();
redirectOutputFile = new FileOutputStream(outputInfoFileName);
int bufferLen = 10*1024;
byte[] byteBuffer = new byte[bufferLen];
int readLen = infoInputStream.read(byteBuffer);
while (readLen != -1) {
if(readLen==bufferLen){
redirectOutputFile.write(byteBuffer);
}else{
redirectOutputFile.write(byteBuffer,0,readLen);
}
readLen = infoInputStream.read(byteBuffer);
}
}catch(IOException ioe){
if(redirectOutputFile!=null){
redirectOutputFile.close();
}
if(infoInputStream!=null){
infoInputStream.close();
}
throw ioe;
}finally{
if(redirectOutputFile!=null){
redirectOutputFile.close();
}
if(infoInputStream!=null){
infoInputStream.close();
}
}
logger.debug("end exec");
}
public static void main(String[] args){
try{
DateFormat yyyyMMDDhhmmss = new SimpleDateFormat("yyyyMMdd_HHmmSSS");
//PerlMutilProcessTest.asyncExecutePerl("C:\\perltest\\test.pl", null);
//PerlMutilProcessTest.syncExecutePerl("C:\\perltest\\test.pl",null,"C:\\perltest\\perlresult"+yyyyMMDDhhmmss.format(new Date())+".txt","C:\\perltest\\perlerror"+yyyyMMDDhhmmss.format(new Date())+".txt");
//PerlMutilProcessTest.asyncExecutePerl("C:\\perltest\\test.pl", new String[]{"123"});
//PerlMutilProcessTest.syncExecutePerl("C:\\perltest\\test.pl",new String[]{"123"},"C:\\perltest\\perlresult"+yyyyMMDDhhmmss.format(new Date())+".txt","C:\\perltest\\perlerror"+yyyyMMDDhhmmss.format(new Date())+".txt");
PerlMutilProcessTest.syncExecuteSyscmd(new String[]{"cmd","/c","tasklist","/v"}, "C:\\perltest\\syscmdresult"+yyyyMMDDhhmmss.format(new Date())+".txt");
}catch(Exception e){
e.printStackTrace();
}
}
}
class ProcessInfo{
private static Logger logger = LoggerFactory.getLogger(ProcessInfo.class);
public static String TYPE_ERROR = "ERROR";
public static String TYPE_OUTPUT = "OUTPUT";
private InputStream is;
private String type;
private OutputStream os;
public ProcessInfo(InputStream is, String type, OutputStream redirect){
this.is = is;
this.type = type;
this.os = redirect;
}
public void redirect(){
PrintWriter pWriter = null;
InputStreamReader isReader = null;
BufferedReader bReader = null;
try{
if (os != null && ProcessInfo.TYPE_OUTPUT.equals(this.type)){
pWriter = new PrintWriter(os);
}
isReader = new InputStreamReader(is);
bReader = new BufferedReader(isReader);
String line = null;
while ( (line = bReader.readLine()) != null){
if (pWriter != null){
pWriter.println(line);
}
}
if (pWriter != null)
pWriter.flush();
} catch (IOException ioe){
try{
if(isReader!=null){
isReader.close();
}
if(bReader!=null){
bReader.close();
}
if(pWriter!=null){
pWriter.close();
}
}catch (IOException tryioe){
logger.error("输出流出现错误,关闭流时出现异常...", tryioe);
}
logger.error("输出流出现错误...", ioe);
}
}
}
分享到:
相关推荐
接下来,我们将展示一个示例C程序,该程序可以用来调用一个Perl脚本并传递参数给它。 ```c #include #include <perl.h> int main() { // 定义Perl解释器指针 static PerlInterpreter *my_perl; // 为解释器...
总之,VB运行Perl脚本工具是通过VB调用Perl解释器实现的,这种技术让VB开发者可以利用Perl的强大力量,特别是在处理文本、网络和系统任务时。"smalltool"可能是一个简单的实现示例,帮助初学者理解和实践这一技术。...
它的主要作用是定义 C 函数如何被 Perl 脚本调用,以及在两者之间如何传递参数和返回结果。XS 语言的核心组件是 XS 接口描述文件,这些文件通常以 .xs 为后缀。 XS 语言的主要特性包括: 1. **参数处理**:XS 负责...
Perl作为一种高级脚本语言,拥有强大的文本处理能力以及灵活的语法特性,但在某些特定场景下,如高性能计算或系统级操作时,C语言由于其直接的硬件访问能力和更高的运行效率,可能成为更优的选择。因此,了解如何在...
由于Perl脚本可能会抛出异常,因此在Java中调用Perl代码时,需要捕获并处理`jerl.JerlException`。此外,需要注意Perl脚本中的错误输出,可以通过`perl.getErrorStream()`获取。 **性能与资源管理** 虽然JERL提供了...
### Perl脚本了解及学习 #### 一、Perl基础概览 **Perl**是一种功能强大的通用编程语言,因其灵活性和适应性而在多个行业中得到广泛应用。无论是处理文本、网络编程还是系统管理,Perl都能轻松胜任。它特别适用于...
这个教程就是关于如何使用Java调用Perl脚本来生成Excel文件,然后将生成的文件压缩为ZIP格式,同时解决可能出现的乱码问题。这里我们将深入探讨这两个关键步骤。 首先,让我们来看看Java调用Perl脚本的部分。在Java...
在源码版本控制方面,Perl脚本如`update_version.pl` 可能用于管理版本号和修订信息,确保每次提交时版本信息的正确性。此外,它们还能与Git或SVN等版本控制系统交互,自动化代码拉取和合并过程。 七、脚本框架 ...
- **步骤**: 使用Csh脚本调用Perl脚本。 - **说明**: 如果在Windows环境下使用Cygwin或类似的Unix-like环境,可以通过Csh脚本来调用Perl脚本。 - **示例**: - 创建一个名为`call_example.csh`的文件。 - 内容如下...
本文将探讨一种技术,即如何使用Python通过'subprocess'模块调用Perl脚本,并进行数据交换。这个过程涉及到Perl与Python之间的通信,以及JSON作为数据交换格式的角色。 标题中的"Perl2Py"是一个示例项目,它展示了...
3. **perlapp命令使用**:通过命令行使用perlapp来编译Perl脚本。基本命令格式可能是`perlapp -o output.exe input.pl`,其中`input.pl`是你的Perl脚本,`output.exe`是你想要生成的可执行文件名。 4. **参数和选项*...
标题 "使 .NET 支持Perl脚本语言3932815.zip" 暗示了这个压缩包可能包含一个解决方案或组件,使得 .NET Framework 能够理解和执行 Perl 脚本语言。在 .NET 开发环境中,通常我们使用 C# 或其他.NET 兼容的语言编写...
接下来,我们来看`replace.bat`批处理文件,它可能是用来调用Perl解释器执行Perl脚本的。批处理文件通常包含命令行指令,例如: ```cmd perl replace_script.pl config_file.txt target_directory ``` 这里,`...
1. **使用系统命令执行Perl脚本**: - VB中可以使用`Shell`函数来执行系统命令。例如,你可以创建一个按钮,在点击按钮的事件处理程序中写入如下代码: ```vb Private Sub Command1_Click() Shell "perl C:\path...
### 在VB中调用Perl代码的方法与技巧 随着软件开发技术的发展,不同编程语言之间的交互变得...通过以上步骤,您可以在VB应用程序中灵活地使用Perl脚本来处理特定任务,从而提高开发效率并简化复杂的业务逻辑处理过程。
Perl还支持模块系统,允许开发者导入和使用外部功能库,如CPAN(Comprehensive Perl Archive Network)提供了成千上万的预编译模块,涵盖了从网络编程到数据库连接的各种功能。例如,要使用LWP::UserAgent模块进行...
- 提供了调试Perl脚本的基本方法和远程调试的技术。 12. 练习题: - 文档中穿插了练习题,用于加深理解,并在附录中提供部分答案供参考。 13. 版权和免责声明: - 强调了此书的版权属于奥宝公司,译本仅供个人...
Perl脚本在IT行业中常被用来处理和解析各种日志数据,特别是在通信和网络领域,其强大的文本处理能力使得它成为解决复杂问题的利器。在本案例中,我们关注的是"Perl脚本提取掉话问题的掉话原因",这涉及到的是对通信...
Perl是一种高级的、通用的编程语言,它具有强大的文本处理能力,通常用于系统管理、网络编程、Web开发和更多领域。Perl脚本以`.pl`作为文件扩展名,以下是Perl脚本的一个基本示例: ```perl #!/usr/bin/perl # 这是...