当前位置:首页 » 编程软件 » 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]

热点内容
linux改变所有者 发布:2025-02-10 23:04:13 浏览:649
源码曹毅 发布:2025-02-10 23:04:01 浏览:581
odbcforsqlserver 发布:2025-02-10 22:26:37 浏览:599
区块链数据存储在那里 发布:2025-02-10 22:25:48 浏览:688
c语言for死循环 发布:2025-02-10 22:24:08 浏览:522
苹果限制访问初始密码 发布:2025-02-10 22:21:31 浏览:758
为什么安卓手机一年后卡顿 发布:2025-02-10 22:15:39 浏览:731
职工信息管理系统设计c语言 发布:2025-02-10 22:15:30 浏览:118
预算法的理念 发布:2025-02-10 22:15:25 浏览:132
如何结合商圈顾客特点配置货品 发布:2025-02-10 22:10:59 浏览:593