其實linux如何運行shell腳本的問題并不復雜,但是又很多的朋友都不太了解shell腳本文件,因此呢,今天小編就來為大家分享linux如何運行shell腳本的一些知識,希望可以幫助到大家,下面我們一起來看看這個問題的分析吧!
如何通過java遠程調用linux命令或shell腳本
1.導入maven依賴jar包
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
2.編輯相應Java代碼
packagecom.ksy.fw.base.util;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.UnsupportedEncodingException;
importorg.apache.commons.lang.StringUtils;
importch.ethz.ssh2.Connection;
importch.ethz.ssh2.Session;
importch.ethz.ssh2.StreamGobbler;
/**
*遠程執行linux的shellscript
*/
publicclassRemoteExecuteCommand{
//字符編碼默認是utf-8
privatestaticStringDEFAULTCHART="UTF-8";
privateConnectionconn;
privateStringip;
privateStringuserName;
privateStringuserPwd;
publicRemoteExecuteCommand(Stringip,StringuserName,StringuserPwd){
this.ip=ip;
this.userName=userName;
this.userPwd=userPwd;
}
publicRemoteExecuteCommand(){
}
/**
*遠程登錄linux的主機
*@return
*登錄成功返回true,否則返回false
*/
publicBooleanlogin(){
booleanflg=false;
try{
conn=newConnection(ip);
conn.connect();//連接
flg=conn.authenticateWithPassword(userName,userPwd);//認證
}catch(IOExceptione){
e.printStackTrace();
}
returnflg;
}
/**
*遠程執行shll腳本或者命令
*@paramcmd即將執行的命令
*@return命令執行完后返回的結果值
*/
publicStringexecute(Stringcmd){
Stringresult="";
try{
if(login()){
Sessionsession=conn.openSession();//打開一個會話
session.execCommand(cmd);//執行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
//如果為得到標準輸出為空,說明腳本執行出錯了
if(StringUtils.isBlank(result)){
result=processStdout(session.getStderr(),DEFAULTCHART);
}
conn.close();
session.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
returnresult;
}
/**
*遠程執行shll腳本或者命令
*@paramcmd即將執行的命令
*@return命令執行成功后返回的結果值,如果命令執行失敗,返回空字符串,不是null
*/
publicStringexecuteSuccess(Stringcmd){
Stringresult="";
try{
if(login()){
Sessionsession=conn.openSession();//打開一個會話
session.execCommand(cmd);//執行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
conn.close();
session.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
returnresult;
}
/**
*解析腳本執行返回的結果集
*@paramin輸入流對象
*@paramcharset編碼
*@return以純文本的格式返回
*/
privateStringprocessStdout(InputStreamin,Stringcharset){
InputStreamstdout=newStreamGobbler(in);
StringBufferbuffer=newStringBuffer();;
try{
BufferedReaderbr=newBufferedReader(newInputStreamReader(stdout,charset));
Stringline=null;
while((line=br.readLine())!=null){
buffer.append(line+"\n");
}
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbuffer.toString();
}
publicstaticvoidsetCharset(Stringcharset){
DEFAULTCHART=charset;
}
publicConnectiongetConn(){
returnconn;
}
publicvoidsetConn(Connectionconn){
this.conn=conn;
}
publicStringgetIp(){
returnip;
}
publicvoidsetIp(Stringip){
this.ip=ip;
}
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetUserPwd(){
returnuserPwd;
}
publicvoidsetUserPwd(StringuserPwd){
this.userPwd=userPwd;
}
publicstaticvoidmain(String[]args){
RemoteExecuteCommandrec=newRemoteExecuteCommand("127.0.0.1","root","root");
//執行命令
System.out.println(rec.execute("chmod777/usr/ksybak/myshell/tomcat-fw.sh"));
System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));
//System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));
//執行腳本
//rec.execute("sh/usr/local/tomcat/bin/statup.sh");
//這個方法與上面最大的區別就是,上面的方法,不管執行成功與否都返回,
//這個方法呢,如果命令或者腳本執行錯誤將返回空字符串
//System.out.println(rec.executeSuccess("ifconfig"));
}
}
Linux中,shell腳本如何使用信號機制去控制線程的開啟關閉
trap是Linux的內建命令,用于捕捉信號,trap命令可以指定收到某種信號時所執行的命令。trap命令的格式如下:trapcommandsig1sig2...sigN,當接收到sinN中任意一個信號時,執行command命令,command命令完成后繼續接收到信號前的操作,直到腳本結束。利用trap命令捕捉INT信號(即與Ctrl+c綁定的中斷信號)。trap還可以忽略某些信號,將command用空字符串代替即可,如trap""TERMINT,忽略kill%n和Ctrl+c發送的信號(kill發送的是TERM信號)。Linux更強勁的殺死進程的命令:kill-9進程號(或kill-9%n作業號)等價與kill-KILL進程號。
舉個例子
:
最近小A需要生產2015年全年的KPI數據報表,現在小A已經將生產腳本寫好了,生產腳本一次只能生產指定一天的KPI數據,假設跑一次生產腳本需要5分鐘,那么:
如果是循環順序執行,那么需要時間:5*365=1825分鐘,約等于6天
如果是一次性放到linux后臺并發執行,365個后臺任務,系統可承受不住哦!
既然不能一次性把365個任務放到linux后臺執行,那么,能不能實現自動地每次將N個任務放到后臺并發執行呢?當然是可以的啦。
#!/bin/bash
source/etc/profile;
#-----------------------------
tempfifo=$$.fifo#$$表示當前執行文件的PID
begin_date=$1#開始時間
end_date=$2#結束時間
if[$#-eq2]
then
if["$begin_date"\>"$end_date"]
then
echo"Error!$begin_dateisgreaterthan$end_date"
exit1;
fi
else
echo"Error!Notenoughparams."
echo"Sample:shloop_kpi2015-12-012015-12-07"
exit2;
fi
#-----------------------------
trap"exec1000>&-;exec1000
mkfifo$tempfifo
exec1000$tempfifo
rm-rf$tempfifo
for((i=1;i
do
echo>&1000
done
while[$begin_date!=$end_date]
do
read-u1000
{
echo$begin_date
hive-fkpi_report.sql--hivevardate=$begin_date
echo>&1000
}&
begin_date=`date-d"+1day$begin_date"+"%Y-%m-%d"`
done
wait
echo"done!!!!!!!!!!"
第6~22行:比如:shloop_kpi_report.sh2015-01-012015-12-01:
$1表示腳本入參的第一個參數,等于2015-01-01
$2表示腳本入參的第二個參數,等于2015-12-01
$#表示腳本入參的個數,等于2
第13行用于比較傳入的兩個日期的大小,\>是轉義
第26行:表示在腳本運行過程中,如果接收到Ctrl+C中斷命令,則關閉文件描述符1000的讀寫,并正常退出
exec1000>&-;表示關閉文件描述符1000的寫
exec1000
trap是捕獲中斷命令
第27~29行:
第27行,創建一個管道文件
第28行,將文件描述符1000與FIFO進行綁定,寫的綁定,則標識對文件描述符1000的所有操作等同于對管道文件$tempfifo的操作
第29行,可能會有這樣的疑問:為什么不直接使用管道文件呢?事實上這并非多此一舉,管道的一個重要特性,就是讀寫必須同時存在,缺失某一個操作,另一個操作就是滯留,而第28行的綁定文件描述符(讀、寫綁定)正好解決了這個問題
第31~34行:對文件描述符1000進行寫入操作。通過循環寫入8個空行,這個8就是我們要定義的后臺并發的線程數。為什么是寫空行而不是寫其它字符?因為管道文件的讀取,是以行為單位的
第37~42行:
第37行,read-u1000的作用就是讀取管道中的一行,在這里就是讀取一個空行;每次讀取管道就會減少一個空行
第39~41行,注意到第42行結尾的&嗎?它表示進程放到linux后臺中執行
第41行,執行完后臺任務之后,往文件描述符1000中寫入一個空行。這是關鍵所在了,由于read-u1000每次操作,都會導致管道減少一個空行,當linux后臺放入了8個任務之后,由于文件描述符1000沒有可讀取的空行,將導致read-u1000一直處于等待。
shell腳本中怎么ssh上遠程機執行命令
假設從主機A,檢查主機B上的進程,需要在主機B上建立檢查用戶,例如叫x,并設置通過publickey認證登錄SSH,不會可以google搜一下,然后,在A機器上執行:sshx@B~/command.sh>result.txtcommand.sh就是B機器上放置在x目錄下的腳本。輸出結果應該是寫到了result.txt或者另一種寫法result=`sshx@B~/command.sh`結果直接保存到result變量中了。暫時沒有linux環境,所以沒有實際測試,你自己試試吧
嵌入式Linux開發中的Linux Shell是什么
雖然我做linux嵌入式測試,不是開發。但我可以告訴你,絕對必要。Linux下很多事情用shell腳本來處理非常方便:
1)啟動腳本,負責啟動系統進程、守護進程等。
2)腳本可以做一些文件處理、命令行工具調用,在C程序中用system系統調用方式執行腳本。
shell腳本編程完成后如何運行
要運行shell腳本可以按照以下步驟:
1.創建shell腳本文件,比如myscript.sh。
2.在腳本文件中添加需要執行的命令或者操作,比如echo"helloworld"。
3.執行命令`chmod+xmyscript.sh`,給腳本文件添加可執行權限。
4.執行腳本命令`./myscript.sh`,注意要在腳本文件所在的目錄下執行該命令。
如果你沒有在腳本文件中添加任何操作或者命令,那么執行腳本將不會有任何輸出結果。確保腳本文件中的操作命令正確,文件名及路徑正確才能有效執行。
另外,如果你想在任何地方執行腳本,可以將腳本文件復制到/bin、/usr/bin或者/usr/local/bin等目錄下。這些目錄是系統默認的環境變量,可以訪問任何目錄下的可執行文件。
END,本文到此結束,如果可以幫助到大家,還望關注本站哦!