- N +

linux如何運行shell腳本(shell腳本文件)

其實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,本文到此結束,如果可以幫助到大家,還望關注本站哦!

返回列表
上一篇:
下一篇: