`

perl脚本调用练习和调用系统命令并展示输出信息

阅读更多
准备好一个简单的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);
	    }
    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics