重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Linux C编程中,调用Linux命令用system函数最简单了,这个函数原理是在你编写的那个程序的内部启动另一个程序或命令,从而创建一个新进程,并等待这个进程执行完毕退出。如果正常执行,system函数将返回被执行程序或命令的退出码;如果无法运行这个程序或命令,将返回错误代码127;如果是其他错误,返回-1。这个函数的原型是:
成都创新互联专注于企业网络营销推广、网站重做改版、凌河网站定制设计、自适应品牌网站建设、H5开发、商城网站开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为凌河等各大城市提供网站开发制作服务。
#include stdlib.h
int system(const char *string);
参数string是将要执行的程序文件名或路径,如果是启动一个命令就是一个命令字符串。
在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到java的process类了。 process这个类是一个抽象类,封装了一个进程(你在调用linux的命令或者shell脚本就是为了执行一个在linux下执行的程序,所以应该使用process类)。 process类提供了执行从进程输入,执行输出到进程,等待进程完成,检查进程的推出状态,以及shut down掉进程。 至于详细的process类的介绍放在以后介绍。 另外还要注意一个类:Runtime类,Runtime类是一个与JVM运行时环境有关的类,这个类是Singleton的。 这里用到的Runtime.getRuntime()方法是取得当前JVM的运行环境,也是java中唯一可以得到运行环境的方法。(另外,Runtime的大部分方法都是实例方法,也就是说每次运行调用的时候都需要调用到getRuntime方法) 下面说说Runtime的exec()方法,这里要注意的有一点,就是public Process exec(String [] cmdArray, String [] envp);这个方法中cmdArray是一个执行的命令和参数的字符串数组,数组的第一个元素是要执行的命令往后依次都是命令的参数,envp感觉应该和C中的execve中的环境变量是一样的,envp中使用的是name=value的方式。 下面说一下,如何使用process来调用shell脚本 例如,我需要在linux下实行linux命令:sh test.sh,下面就是执行test.sh命令的方法: 这个var参数就是日期这个201102包的名字。 String shpath="/test/test.sh"; //程序路径 Process process =null; String command1 = “chmod 777 ” + shpath; process = Runtime.getRuntime().exec(command1); process.waitFor(); String var="201102"; //参数 String command2 = “/bin/sh ” + shpath + ” ” + var; Runtime.getRuntime().exec(command2).waitFor();
目的:用Python做出全自动化的pipline,用于rrbs
最近有个需求就是页面上执行shell命令,第一想到的就是os.system,
os.system('cat /proc/cpuinfo')
但是发现页面上打印的命令执行结果 0或者1,当然不满足需求了。
尝试第二种方案 os.popen()
output = os.popen('cat /proc/cpuinfo')printoutput.read()
通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。但是无法读取程序执行的返回值)
尝试第三种方案 commands.getstatusoutput() 一个方法就可以获得到返回值和输出,非常好用。
(status, output) = commands.getstatusoutput('cat /proc/cpuinfo')printstatus, output
Python Document 中给的一个例子,
import commands commands.getstatusoutput('ls /bin/ls')
(0, '/bin/ls') commands.getstatusoutput('cat /bin/junk')
(256,'cat: /bin/junk: No such file or directory') commands.getstatusoutput('/bin/junk')
(256,'sh: /bin/junk: not found') commands.getoutput('ls /bin/ls')'/bin/ls' commands.getstatus('/bin/ls')'-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'
最后页面上还可以根据返回值来显示命令执行结果。
Android的底层是Linux内核,因此在shell环境下可以运行Linux命令,尤其是经过root处理的android系统,基本上可以通过调用Linux命令完全控制手机,下面的RootCmd.java代码可以实现运行Linux外部命令。
package my.android.code;
import android.os.Environment;
import dalvik.annotation.Signature;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;
public final class RootCmd
{
//执行linux命令并且输出结果
protected static Vector execRootCmd(String paramString)
{
Vector localVector = new Vector();
try
{
Process localProcess = Runtime.getRuntime().exec("su ");//经过Root处理的android系统即有su命令
OutputStream localOutputStream = localProcess.getOutputStream();
DataOutputStream localDataOutputStream = new DataOutputStream(localOutputStream);
InputStream localInputStream = localProcess.getInputStream();
DataInputStream localDataInputStream = new DataInputStream(localInputStream);
String str1 = String.valueOf(paramString);
String str2 = str1 + "\n";
localDataOutputStream.writeBytes(str2);
localDataOutputStream.flush();
String str3 = localDataInputStream.readLine();
localVector.add(str3);
localDataOutputStream.writeBytes("exit\n");
localDataOutputStream.flush();
localProcess.waitFor();
return localVector;
}
catch (Exception localException)
{
localException.printStackTrace();
}
}
//执行linux命令但不关注结果输出
protected static int execRootCmdSilent(String paramString)
{
try
{
Process localProcess = Runtime.getRuntime().exec("su");
Object localObject = localProcess.getOutputStream();
DataOutputStream localDataOutputStream = new DataOutputStream((OutputStream)localObject);
String str = String.valueOf(paramString);
localObject = str + "\n";
localDataOutputStream.writeBytes((String)localObject);
localDataOutputStream.flush();
localDataOutputStream.writeBytes("exit\n");
localDataOutputStream.flush();
localProcess.waitFor();
localObject = localProcess.exitValue();
return localObject;
}
catch (Exception localException)
{
localException.printStackTrace();
}
}
//判断机器Android是否已经root,即是否获取root权限
protected static boolean haveRoot()
{
int i = execRootCmdSilent("echo test"); //通过执行测试命令来检测
if (i != -1) return true;
retrun false;
}
}
java程序是提供了这个一方法, Process pro = Runtime.getRuntime().exec(cmds);
但是一般来说,尽量去用一些其他脚本(lua,shell,python)去执行一系列linux命令比较灵活, 而且耗费资源少。但是Runtime.getRuntime().exec()这种调用方式在java虚拟机中是十分消耗资源的,即使命令可以很快的执行完毕,频繁的调用时创建进程消耗十分可观。
java虚拟机执行这个命令的过程是,首先克隆一条和当前虚拟机拥有一样环境变量的进程,再用这个新的进程执行外部命令,最后退出这个进程。频繁的创建对CPU和内存的消耗很大。
下面是一个调用linux命令的例子:
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);
}
}
}
注:参数中“/bin/sh“ “-c“ 是可以用shell执行指定的命令的意思
这里/bin/sh -c ps -ef|grep java,会执行ps linux命令
一、使用方法
1,首先,点击屏幕左下角的Win图标,然后在弹出的菜单中选择“所有应用”。
2,在所有应用中找到并展开 Windows PowerShell 文件夹,启动其下的 Windows PowerShell。
3,这时,将会打开一个命令行窗口。然后,请稍微等待一会,直到出现 PowerShell 命令提示符为止。
4,这时,便可以输入 Linux 命令了。例如,我们输入一个 Linux 文件查看命令 ls,回车,便可以列出当前目录下的文件和文件夹列表。
二、注意事项
1,Windows PowerShell 支持绝大部分 Linux 内置命令,但有些命令例外。具体来说有:
1)命令简写(或称命令别名)
例如,不支持 Linux 下的文件查看命令 ll 。该命令作用为以详细信息方式查看当前目录下文件,它实质是 ls -l 命令的简写。
2)需要调用 linux 系统中的程序才能执行的命令,如 vim
由于 Windows 系统中并没有内置 vim 程序,故而与 vim 有关的命令无法启用。
3)帮助命令
在 Linux 系统中,如果要知道某条命令的用法,可以使用帮助命令了。但在 Windows 中,默认是没有安装Linux中的帮助命令的。如果想使用该命令,可以联网安装或在线查看。