设为首页 收藏本站
查看: 659|回复: 0

[经验分享] hadoop如何封装shell脚本

[复制链接]

尚未签到

发表于 2016-12-10 06:21:08 | 显示全部楼层 |阅读模式
package com.taobao.hsf.tlog.config.shell;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
abstract class Shell {
public static class ShellCommandExecutor extends Shell {
private final String[] command;
private StringBuffer output;
public ShellCommandExecutor(String[] execString) {
command = execString.clone();
}
public ShellCommandExecutor(String[] execString, File dir) {
this(execString);
this.setWorkingDirectory(dir);
}
public ShellCommandExecutor(String[] execString, File dir, Map<String, String> env) {
this(execString, dir);
this.setEnvironment(env);
}
public void execute() throws IOException {
this.run();
}
public String getOutput() {
return (output == null) ? "" : output.toString();
}
@Override
protected String[] getExecString() {
return command;
}
@Override
protected void parseExecResult(BufferedReader lines) throws IOException {
output = new StringBuffer();
char[] buf = new char[512];
int nRead;
while ((nRead = lines.read(buf, 0, buf.length)) > 0) {
output.append(buf, 0, nRead);
}
}
}
static class ExitCodeException extends IOException {
private static final long serialVersionUID = -7102633161419484030L;
int exitCode;
public ExitCodeException(int exitCode, String message) {
super(message);
this.exitCode = exitCode;
}
public int getExitCode() {
return exitCode;
}
}
private static final Logger logger = LoggerFactory.getLogger(Shell.class);
public static final boolean WINDOWS = System.getProperty("os.name").startsWith("Windows");
public static String execCommand(Map<String, String> env, String... cmd) throws IOException {
ShellCommandExecutor exec = new ShellCommandExecutor(cmd);
if (env != null) {
exec.setEnvironment(env);
}
exec.execute();
return exec.getOutput();
}
public static String execCommand(String... cmd) throws IOException {
return execCommand(null, cmd);
}
private Map<String, String> environment;
private File dir;
private Process process;
private int exitCode;
public int getExitCode() {
return exitCode;
}
public Process getProcess() {
return process;
}
protected abstract String[] getExecString();
protected abstract void parseExecResult(BufferedReader lines) throws IOException;
protected void run() throws IOException {
exitCode = 0; //reset
runCommand();
}
protected void setEnvironment(Map<String, String> env) {
this.environment = env;
}
protected void setWorkingDirectory(File dir) {
this.dir = dir;
}
private void runCommand() throws IOException {
ProcessBuilder builder = new ProcessBuilder(getExecString());
boolean completed = false;
if (environment != null) {
builder.environment().putAll(this.environment);
}
if (dir != null) {
builder.directory(this.dir);
}
process = builder.start();
final BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
BufferedReader inReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
final StringBuffer errMsg = new StringBuffer();
Thread errThread = new Thread() {
@Override
public void run() {
try {
String line = errReader.readLine();
while ((line != null) && !isInterrupted()) {
errMsg.append(line);
errMsg.append(System.getProperty("line.separator"));
line = errReader.readLine();
}
} catch (IOException ioe) {
logger.warn("Error reading the error stream", ioe);
}
}
};
try {
errThread.start();
} catch (IllegalStateException ise) {
}
try {
parseExecResult(inReader);
exitCode = process.waitFor();
try {
errThread.join();
} catch (InterruptedException ie) {
logger.warn("Interrupted while reading the error stream", ie);
}
completed = true;
if (exitCode != 0) {
throw new ExitCodeException(exitCode, errMsg.toString());
}
} catch (InterruptedException ie) {
throw new IOException(ie.toString());
} finally {
try {
inReader.close();
} catch (IOException ioe) {
logger.warn("Error while closing the input stream", ioe);
}
if (!completed) {
errThread.interrupt();
}
try {
errReader.close();
} catch (IOException ioe) {
logger.warn("Error while closing the error stream", ioe);
}
process.destroy();
}
}
}
/*
* 使用Shell封装
*/
public class StormScheduler {
private final static File workDir = new File("/home/admin");
public static void main(String[] args) {
schedule("tlog");
}
public static void schedule(String appName) {
System.out.println("Start to execute schedule shell: '/bin/bash storm_scheduler.sh " + appName + "'");
Shell.ShellCommandExecutor executor = new Shell.ShellCommandExecutor(new String[] { "/bin/bash",
"storm_scheduler.sh", appName }, workDir);
try {
executor.execute();
} catch (IOException e) {
System.out.println("Shell Exception, " + e);
throw new RuntimeException("StormScheduler error, appName= " + appName, e);
}
System.out.println("Shell output: " + executor.getOutput());
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-311970-1-1.html 上篇帖子: Hadoop之TaskTraker分析(转) 下篇帖子: Hadoop之RandomTextWriter说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表