當前位置:首頁 » 編程軟體 » shell腳本非同步

shell腳本非同步

發布時間: 2022-08-31 18:43:42

Ⅰ shell腳本 手動執行成功,crontab執行缺少數據

sh /usr/local/sbin/gdas/start.sh
改為
source /usr/local/sbin/gdas/start.sh
用sh方式去執行就是另開一個shell去跑,相當於是非同步的,不等start.sh執行完就執行下面的判斷了。用source在當前shell執行該腳本,就是阻塞方式,就不存在此問題了。
建議先手動執行腳本,檢驗無誤了再加入crontab

Ⅱ SHELLEXECUTE的執行方式是非同步的還是同步的

線程同步是多個線程同時訪問同一資源,等待資源訪問結束,浪費時間,效率低,串列執行任務線程非同步:訪問資源時在空閑等待時同時訪問其他資源,實現多線程機制,並行執行任務1.2.3模式使用GCD的主隊列.使用NSOperationQueue,把最大線程數

Ⅲ 如何在java程序中調用linux命令或者shell腳本

做到這,主要依賴2個類:Process和Runtime。
首先看一下Process類:
ProcessBuilder.start() 和 Runtime.exec 方法創建一個本機進程,並返回 Process 子類的一個實例,
該實例可用來控制進程並獲得相關信息。Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、
檢查進程的退出狀態以及銷毀(殺掉)進程的方法。
創建進程的方法可能無法針對某些本機平台上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows
上的 Win16/DOS 進程,或者 shell 腳本。創建的子進程沒有自己的終端或控制台。它的所有標准 io(即 stdin、stdout 和 stderr)
操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。
父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平台僅針對標准輸入和輸出流提供有限的緩沖區大小,
如果讀寫子進程的輸出流或輸入流迅速出現失敗,則可能導致子進程阻塞,甚至產生死鎖。
當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續非同步執行子進程。
對於帶有 Process 對象的 Java 進程,沒有必要非同步或並發執行由 Process 對象表示的進程。
特別需要注意的是:
1,創建的子進程沒有自己的終端控制台,所有標注操作都會通過三個流
(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程(父進程可通過這些流判斷子進程的執行情況)
2,因為有些本機平台僅針對標准輸入和輸出流提供有限的緩沖區大小,如果讀寫子進程的輸出流或輸入流迅速出現失敗,
則可能導致子進程阻塞,甚至產生死鎖
abstract void destroy()
殺掉子進程。
abstract int exitValue()
返回子進程的出口值。根據慣例,值0表示正常終止。
abstract InputStream getErrorStream()
獲取子進程的錯誤流。
abstract InputStream getInputStream()
獲取子進程的輸入流。
abstract OutputStream getOutputStream()
獲取子進程的輸出流。
abstract int waitFor()
導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。
如果已終止該子進程,此方法立即返回。如果沒有終止該子進程,調用的線程將被阻塞,直到退出子進程。
特別需要注意:如果子進程中的輸入流,輸出流或錯誤流中的內容比較多,最好使用緩存(注意上面的情況2)
再來看一下Runtime類:
每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環境相連接。可以通過getRuntime方法獲取當前運行時環境。
應用程序不能創建自己的Runtime類實例。
介紹幾個主要方法:
Process exec(String command)
在單獨的進程中執行指定的字元串命令。
Process exec(String command, String[] envp)
在指定環境的單獨進程中執行指定的字元串命令。
Process exec(String command, String[] envp, File dir)
在有指定環境和工作目錄的獨立進程中執行指定的字元串命令。
Process exec(String[] cmdarray)
在單獨的進程中執行指定命令和變數。
Process exec(String[] cmdarray, String[] envp)
在指定環境的獨立進程中執行指定命令和變數。
Process exec(String[] cmdarray, String[] envp, File dir)
在指定環境和工作目錄的獨立進程中執行指定的命令和變數。
command:一條指定的系統命令。
envp:環境變數字元串數組,其中每個環境變數的設置格式為name=value;如果子進程應該繼承當前進程的環境,則該參數為null。
dir:子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為null。
cmdarray:包含所調用命令及其參數的數組。
以下為示例(要打成可執行jar包扔到linux下執行):
public class test {
public static void main(String[] args){
InputStream in = null;
try {
Process pro = Runtime.getRuntime().exec(new String[]{"sh",
"/home/test/test.sh","select admin from M_ADMIN",
"/home/test/result.txt"});
pro.waitFor();
in = pro.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String result = read.readLine();
System.out.println("INFO:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在這用的是Process exec(String[] cmdarray)這個方法
/home/test/test.sh腳本如下:
#!/bin/sh

#查詢sql
SQL=$1
#查詢結果保存文件
RESULT_FILE=$2
#資料庫連接
DB_NAME=scott
DB_PWD=tiger
DB_SERVER=DB_TEST

RESULT=`sqlplus -S ${DB_NAME}/${DB_PWD}@${DB_SERVER}<< !
set heading off
set echo off
set pages 0
set feed off
set linesize 3000
${SQL}
/
commit
/
!`

echo "${RESULT}" >> ${RESULT_FILE}
echo 0;
特別需要注意的是,當需要執行的linux命令帶有管道符時(例如:ps -ef|grep java),用上面的方法是不行的,解決方式是將需要執行的命令作為參數傳給shell
public class Test {
public static void main(String[] args) throws Exception{
String[] cmds = {"/bin/sh","-c","ps -ef|grep java"};
Process pro = Runtime.getRuntime().exec(cmds);
pro.waitFor();
InputStream in = pro.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = read.readLine())!=null){
System.out.println(line);
}
}
}

PS:
Runtime.getRuntime().exec()這種調用方式在java虛擬機中是十分消耗資源的,即使命令可以很快的執行完畢,頻繁的調用時創建進程消耗十分客觀。
java虛擬機執行這個命令的過程是,首先克隆一條和當前虛擬機擁有一樣環境變數的進程,再用這個新的進程執行外部命令,最後退出這個進程。頻繁的創建對CPU和內存的消耗很大。

Ⅳ shell的VB語句

Shell(pathname[,windowstyle])
Shell 函數的語法含有下面這些命名參數: 部分 描述 pathname 必要參數。Variant (String),要執行的程序名,以及任何必需的參數或命令行變數,可能還包括目錄或文件夾,以及驅動器。 Windowstyle 可選參數。Variant (Integer),表示在程序運行時窗口的樣式。如果 windowstyle 省略,則程序是以具有焦點的最小化窗口來執行的。 windowstyle 命名參數有以下這些值: 常量 值 描述 vbHide 0 窗口被隱藏,且焦點會移到隱式窗口。 VbNormalFocus 1 窗口具有焦點,且會還原到它原來的大小和位置。 VbMinimizedFocus 2 窗口會以一個具有焦點的圖標來顯示。 VbMaximizedFocus 3 窗口是一個具有焦點的最大化窗口。 VbNormalNoFocus 4 窗口會被還原到最近使用的大小和位置,而當前活動的窗口仍然保持活動。 VbMinimizedNoFocus 6 窗口會以一個圖標來顯示。而當前活動的的窗口仍然保持活動。 如果Shell 函數成功地執行了所要執行的文件,則它會返回程序的任務 ID。任務 ID 是一個唯一的數值,用來指明正在運行的程序。如果 Shell 函數不能打開命名的程序,則會產生錯誤。
注意 預設情況下,Shell 函數是以非同步方式來執行其它程序的。也就是說,用Shell 啟動的程序可能還沒有完成執行過程,就已經執行到 Shell 函數之後的語句。 示例一:
本示例使用Shell 函數來完成一個用戶指定的應用程序。
' 將第二個參數值設成1,可讓該程序以正常大小的窗口完成,並且擁有焦點。 Dim RetValRetVal = Shell("C:WINDOWSCALC.EXE", 1) ' 完成Calculator。
示例二:
使用shell腳本調用linux中當前時間,並記錄在log文件中,10秒後再次記錄時間。 date>>/tmp/data.logsleep10date>>/tmp/data.log3ds Max 對象空間修改器
「修改」面板 > 作出選擇> 「修改器列表」 > 「對象空間修改器」 > 「殼」
選擇> 「修改器」菜單 > 「參數化變形器」 > 「殼」
通過添加一組朝向現有面相反方向的額外面,「殼」修改器「凝固」對象或者為對象賦予厚度,無論曲面在原始對象中的任何地方消失,邊將連接內部和外部曲面。可以為內部和外部曲面、邊的特性、材質 ID 以及邊的貼圖類型指定偏移距離。
同時,由於「殼」修改器沒有子對象,所以可以使用「選擇」選項指定面選擇,該面選擇在其他修改器的堆棧上傳遞。請注意,「殼」修改器並不能識別現有子對象選擇,也不能通過這些堆棧上的選擇。
左:移除由部分曲面構成的球體;右圖:應用殼的球體
通常使用對象上的「殼」,移除部分曲面,例如如上所述的具有幾個刪除頂點或曲面的球體。要獲得最佳結果,原始多邊形的面應該朝外。如果對象的面沒有一條自由邊,「殼」將不會創建任何邊。

Ⅳ 什麼是Shell,它的作用是什麼

在計算機科學中,Shell俗稱殼(用來區別於核),是指「為使用者提供操作界面」的軟體(命令解析器)。它類似於DOS下的command.com和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。

用途:使用用戶的預設憑證和環境執行 shell。

在UEFI環境下,EFI的Shell環境提供了一組豐富的擴展和增強的命令,在以後的計算機中,傳統的DOS界面將會被SHELL環境所取代,所有的.exe文件將不會在以後支持SHELL的環境中出現,取而代之的文件後綴是.efi。在SHELL環境下,分為IA32和X64,32位的*.efi文件不能在X64的計算機中運行。

(5)shell腳本非同步擴展閱讀

如果Shell函數成功地執行了所要執行的文件,則它會返回程序的任務 ID。任務 ID 是一個唯一的數值,用來指明正在運行的程序。如果Shell函數不能打開命名的程序,則會產生錯誤。

預設情況下,Shell函數是以非同步方式來執行其它程序的。也就是說,用Shell啟動的程序可能還沒有完成執行過程,就已經執行到Shell函數之後的語句。

Ⅵ 請教一個非同步執行shell命令的程序寫法

vb我知道利用GetProcessVersion函數來做,以下代碼供參考:

Option Explicit

Private Declare Function GetProcessVersion Lib "kernel32" (ByVal ProcessId As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Function ShellEx(ByVal FileName As String, Optional ByVal WindowStyle As VbAppWinStyle = vbNormalFocus, Optional ByVal DelayTime As Long = -1)
'與SHELL函數一樣的參數,不過是阻塞執行.(同步)
'FileName - 目標文件名
'WindowStyle - 程序運行時窗口的樣式
'DelayTime - 等待的時間,單位為ms
'備注:
' DelayTime設置為-1時表示一直等待,直到目標程序運行結束
Dim I As Long, J As Long

I = Shell(FileName, WindowStyle)
Do
If GetProcessVersion(I) = 0 Then Exit Do
Sleep 10
J = J + 1
If DelayTime <> -1 And J > DelayTime \ 10 Then Exit Do
Loop
End Function

Public Function ShellOnce(ByVal FileName As String, Optional ByVal WindowStyle As VbAppWinStyle = vbNormalFocus)
'與SHELL函數一樣的參數,但只將目標執行一次
'FileName - 目標文件名
'WindowStyle - 程序運行時窗口的樣式
Static I As Long

If I <> 0 Then '如果有PID值就判斷其是否正在執行
If GetProcessVersion(I) <> 0 Then Exit Function '如果正在執行,函數返回
End If
I = Shell(FileName, WindowStyle)
End Function

Ⅶ (VB中)預設情況下,Shell函數是以非同步方式來執行其它程序的,那如果要同步執行程序,要怎麼做

真神人也Private Sub sh()
Dim x As Long
x = Shell("C:\AA.exe", vbNormalFocus)
Do While x = 0DoEvents
Loop'其他代碼。。。
End Sub這個代碼中,shell返回之後,x的值還會改變嗎???????????? 要想同步,可以用API函數,CreateProcess 創建進程,再用 WaitForSingleObject 等特進程句柄返回信號。代碼比較復雜,我就不多說了。

Ⅷ 在linux下調用shell,是同步還是非同步

系統調用是程序的事情 shell是人機介面,是你輸入命令的地。 這兩個完全無關。 你在shell裡面輸入命令,shell會根據你的命令執行程序, 執行的程序有可能調用系統的功能。

python 調用shell命令是非同步的么

代碼如下:
output = os.popen('cat /proc/cpuinfo')
print output.read()
通過 os.popen() 返回的是 file read 的對象,對其進行讀取 read() 的操作可以看到執行的輸出。但是無法讀取程序執行的返回值)
嘗試第三種方案 commands.getstatusoutput() 一個方法就可以獲得到返回值和輸出,非常好用。

Ⅹ 什麼是shell命令windows系統也有shell命令嗎

Shell(也稱為殼層)在計算機科學中指「為用戶提供用戶界面」的軟體,通常指的是命令行界面的解析器。一般來說,這個詞是指操作系統中提供訪問內核所提供之服務的程序。Shell也用於泛指所有為用戶提供操作界面的程序,也就是程序和用戶交互的層面。因此與之相對的是內核(英語:Kernel),內核不提供和用戶的交互功能。

不過這個詞也拿來指應用軟體,或是任何在特定組件外圍的軟體,例如瀏覽器或電子郵件軟體是HTML排版引擎的Shell。Shell這個詞是來自於操作系統(內核)與用戶界面的外層界面。

通常將shell分為兩類:命令行與圖形界面。命令行殼層提供一個命令行界面(CLI);而圖形殼層提供一個圖形用戶界面(GUI)。

[Wikipedia:殼層]

==========================

虛擬終端機(英語:Terminal emulator)是在個人電腦上虛擬的一個終端以及為此目的而寫的軟體。虛擬終端的目的是達到個人電腦及其用戶能夠與大型計算機的連接。一般來說需要連接的大型計算機是IBM的大型計算機或者所謂的超小型計算機(過去往往是迪吉多的VAX)。

虛擬終端使得個人電腦的用戶可以直接使用他的個人電腦來與大型計算機聯系,而不必使用專門的終端。

通過虛擬終端的軟體虛擬終端還可以擴展大型計算機的標准終端的功能,通過虛擬終端不但可以將個人電腦上的數據傳遞給大型計算機,而且還可以將大型計算機的數據傳遞給個人電腦,並在個人電腦上繼續加工。

一般大型計算機的終端是字母式的輸入和輸出介面,因此一個虛擬終端至少需要一個能夠模擬這樣的字母式(比如ASCII)輸入和輸出介面的能力。最常見的平台是圖像式的用戶表面。要使得新的、圖像式的程序能夠使用老的字母式的或者沒有圖像式輸入和輸出能力的程序也需要虛擬終端。

現代的大型計算機也內部使用虛擬終端,這樣它們可以向老的、需要終端的程序假裝一個終端,而實際上它則將程序的顯示轉到顯卡上。比如Linux以及其它大多數基於個人電腦的類似Unix的操作系統假裝有六至十個這樣的「虛擬」的終端。

[Wikipedia:虛擬終端]

==========================

Windows命令提示符(cmd.exe)是Windows NT下的一個用於運行Windows控制台程序或某些DOS程序的殼層程序;或在Windows CE下只用於運行控制台程序的殼層程序。它被用於替代Windows 9x系統中所提供的COMMAND.COM和「MS-DOS提示符」。命令提示符的最初版本由Therese Stowell開發。

[Wikipedia:命令提示符]

==========================

PowerShell(包括Windows PowerShell和PowerShell Core)是微軟公司開發的任務自動化和配置管理框架,由.NET Framework和.NET Core是構建的命令行界面殼層相關腳本語言組成,最初僅Windows組件,後於2016年8月18日開源並跨平台支持。[3]

在PowerShell中,管理任務通常由cmdlets(發音為command-lets)執行,這是執行特定操作的專用.NET類。可以將cmdlet集合至腳本、可執行文件(一般是獨立應用程序)中,或通過常規.NET類(或WMI / COM對象)實例化。[4][5]通過訪問不同數據存儲中的數據由PowerShell運行,如資源管理器或注冊表。

[Wikipedia:Windows PowerShell]

==========================

Windows shell是Microsoft Windows操作系統的圖形用戶界面。Windows shell易於識別的元素包括桌面、任務欄、開始菜單、任務切換器和自動播放等特徵。在某些版本的Windows上,還包括Flip 3D和魅力(charms)等功能。在Windows 10中,Windows Shell Experience Host界面可以驅動視覺效果,如「開始」菜單,「操作中心」和「任務欄」、Task View/Timeline。另外,Windows shell還實現了一個shell命名空間,該命名空間使Windows上運行的計算機程序能夠通過shell對象架構訪問計算機的資源。「桌面」是層次結構的頂級對象,在它之下有一些存儲在磁碟上的文件和文件夾,以及一些內容為虛擬或動態創建的特殊文件夾,如垃圾箱、控制面板、我的計算機、我的網路位置等等。

基本上講,Shell是由文件夾組成的,文件夾是一個包含有子元素的容器,包括子文件夾,這些元素通常稱為文件夾項。根文件夾稱為『桌面』,其子項包括『我的計算機』,『網上鄰居』,『回收站』,和其他可能的項,所有這些文件夾的集合稱之為Shell的命名空間。文件夾實際上是一個Shell對象,它的行為被編碼成一個COM模塊,向Windows Shell暴露公共的介面。通過連接,文件夾可以告訴Shell怎樣設計它的內容,使用什麼樣的圖標顯示,採用什麼文字來描述。文件對象是一個包含在普通文件夾中的項—文件、記錄、內存塊、連接的設備等。『文件夾項』、『文件夾元素』和『文件對象』這些術語是等價的。任何文件夾的內容都是通過一個對象調用Shell viewer顯示在Windows explorer.exe中的。每一個文件夾都定義了他自己的Shell viewer對象,並且所有相關於這個用戶介面的任務都指派到這個對象上。

從概念上講,桌面是所有Windows Shell對象的父對象,即宿主對象。就實現方式而言,桌面是一個系統定義窗口類的特殊窗口(命名為#32769),並且是所有窗口的祖先窗口。那些導出應用的頂層窗口一般而言都是桌面的子窗口。[1]

主要的Windows Shell部件就是任務欄,它實際上就是由explorer.exe進程所擁有的一個窗口。當終止explorer.exe進程的時候,都將引起任務條的消失和重新顯現。每當任務欄重新顯現的時候,它注冊一個具有不同HWND的新窗口。任務條擁有「開始」按鈕的窗口,在托盤區域有時鍾和類似按鈕的控制項,表示正在運行的應用。任務條實際上與窗口一樣,可以在其上作任何窗口上可以做的操作如移動、隱藏和子類化等。

explorer.exe是一個扮演著系統外殼角色的應用程序。當說到外殼擴展的時候,就是由explorer.exe感知的、裝入的並最終執行的代碼塊。explorer.exe可以被看作為一個微型的窗口開發環境:它有自己的函數和對話框;允許寫特殊的與已存在的體系集成的應用程序;能包容應用和文檔。甚至可以解釋任何活動的腳本兼容語言的腳本(VBScript,JScript,Perl,等等)。採用COM介面和進程內伺服器(實質上的DLL)

在Win16環境中,與Shell唯一的通訊方式是通過動態數據交換(DDE)。

[Wikipedia:Windows Shell]

熱點內容
桑塔納全秀和半袖哪個配置高 發布:2025-02-10 07:55:42 瀏覽:349
手紋演算法 發布:2025-02-10 07:52:27 瀏覽:37
愛奇藝怎麼看賬號密碼 發布:2025-02-10 07:51:43 瀏覽:351
破解訪問許可權 發布:2025-02-10 07:17:24 瀏覽:663
慶余年密碼多少 發布:2025-02-10 07:16:38 瀏覽:201
ftp包括有哪兩個連接 發布:2025-02-10 07:11:50 瀏覽:423
壓縮模量es 發布:2025-02-10 07:11:47 瀏覽:115
雞尾酒配置酒什麼意思 發布:2025-02-10 07:01:34 瀏覽:139
c語言的架構設計 發布:2025-02-10 06:59:59 瀏覽:748
柯南可以緩存 發布:2025-02-10 06:59:52 瀏覽:422