现在我们无论是工作中还是学习中很多情况下用到Linux系统,当我们需要在C#代码中调用类似与cmd窗口执行命令时候,就需要用到此方法

public static Process CommitCommand(string commandStr, string workingDir, Action<DataReceivedEventArgs> action)
{
var logger = LogManager.GetCurrentClassLogger();
try
{
logger.Debug("Get into CommitCommand");
Process process = new Process();
process.StartInfo.FileName = commandStr.Substring(0, commandStr.IndexOf(" ")).Trim();
var pathDir = Environment.GetEnvironmentVariable("PATH").Split(RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? ":" : ";", StringSplitOptions.RemoveEmptyEntries)
.FirstOrDefault(s =>
File.Exists(Path.Combine(s, process.StartInfo.FileName)) ||
File.Exists(Path.Combine(s, process.StartInfo.FileName + ".exe")));
if (string.IsNullOrEmpty(pathDir))
{
process.StartInfo.FileName = Path.GetFullPath(process.StartInfo.FileName, workingDir);
}
process.StartInfo.Arguments = commandStr.Substring(commandStr.IndexOf(" ")).Trim();
process.StartInfo.WorkingDirectory = string.IsNullOrWhiteSpace(workingDir) ? process.StartInfo.WorkingDirectory : workingDir;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.ErrorDialog = false;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.ErrorDataReceived += (sender, args) =>
{
action(args);
logger.Error($"ErrorDataReceived:commandStr:{commandStr}. workingDir:{workingDir}. Error:{args.Data}");
};
process.EnableRaisingEvents = true;
process.OutputDataReceived += (sender, args) =>
{
action(args);
//logger.Debug($"OutputDataReceived:{args.Data}");
};
process.Exited += (sender, args) =>
{
logger.Debug("程序退出!");
logger.Error($"Exited:commandStr:{commandStr}. workingDir:{workingDir}");
};
process.Start(); process.StandardInput.AutoFlush = true;//process.StandardInput.WriteLine("")
process.BeginErrorReadLine();
process.BeginOutputReadLine();
logger.Debug("Sign out CommitCommand");
return process;
}
catch (Exception e)
{
logger.Error(e, "process can not start.");
logger.Debug(e.Message);
return null;
}
}
 

调用也非常简单,参数1:执行得命令 参数2:路径 比如说我们需要运行mysql,就需要在对应文件夹内执行对应命令,这个时候第二个参数就可以传入路径

然后我再给出一个调用得例子

Process pc = new Process();
pc = ToolClass.CommitCommand("nvidia-smi", "/", args =>
{
if (!string.IsNullOrEmpty(args.Data))
{
useGpuNumber.Add(args.Data);
}
});
pc.WaitForExit();
pc.Dispose();

我这里时查看显卡也就是GPU得信息的命令,可以再root下执行,然后我这里就传入了一个/,拿到执行命令返回的数据

Linux系统执行命令方法的更多相关文章

  1. Android 开发进入Linux系统执行命令 2018-5-25 Fri.

    /** * 进入linux cmd执行命令 * * @param command * @return */ private boolean runRootCommand(String command) ...

  2. 修改linux系统时间的方法(date命令)

    修改linux系统时间的方法(date命令) 来源:互联网 作者:佚名 时间:11-18 23:22:27 [大 中 小] date命令不仅可以显示系统当前时间,还可以用它来修改系统时间,下面简单的介 ...

  3. [转帖]Linux后端执行命令的方法

    Linux 后台执行命令的方法 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4241330&fromuid=212883 ...

  4. php 执行计划任务方式之 linux crontab 执行命令

    一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动c ...

  5. 查看linux系统版本命令 (转)

    查看linux系统版本命令 分类: Linux 知识小结2011-10-10 15:26 240162人阅读 评论(9) 收藏 举报 linuxredhatdebianx86susesun 一.查看内 ...

  6. Linux系统——awk命令

    awk命令不仅仅是Linux系统的命令,也是一种编程语言,用来处理数据和生成报告(Exel),处理的数据可以是一个或多个文件(标准输入和管道获取标准输入).可在命令行上编辑操作,也可以写成awk程序运 ...

  7. Linux系统ifconfig命令找不到,centos ifconfig Command not found

    centos ifconfig Command not found,Linux系统ifconfig命令找不到 >>>>>>>>>>>& ...

  8. Linux系统基础命令

    这是看itercast的学习笔记 Linux系统基础命令 日期时间 命令date用以查看.设置当前系统时间:格式化显示时间: +%Y--%m--%d 命令hwclock(clock)用以显示硬件时钟时 ...

  9. Linux系统-解压缩命令集合

    Linux系统-解压缩命令集合 linux zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. ...

随机推荐

  1. CSS5:移动端页面(响应式)

    CSS5:移动端页面(响应式) 如果手机端和PC端页面差别很大,就不要写响应式,不要写@media 就直接将两个页面拆开成两个文件就可以了.关于判断是手机端你还是PC端,就交给后端来做只有一些新闻站点 ...

  2. Django ElasticSearch Ionic 打造 GIS 移动应用 —— 架构设计

    搜索引擎是个好东西,GIS也是个好东西.当前还有Django和Ionic.最后效果图 构架设计 对我们的需求进行简要的思考后,设计出了下面的一些简单的架构. GIS架构说明 -- 服务端 简单说明: ...

  3. java中finally有什么意义呢,在现实中?举例

    马克-to-win: finally有什么意义呢,在现实中?比如你开了一个流处理文件,可能没开成功,或开成功了,但后面的操作失败了,但不管你怎么样,你必须在一个地儿把它关闭,那就是finally块儿. ...

  4. 使用 ssm 实现登录日志记录

    使用 ssm 实现登录日志记录 学习总结 一.基础准备 1. 实现效果 2. 数据表 2.1 登陆日志信息表 2.3 员工表 二.代码实现 1. SysLogLogin 实体类 2. LogAspec ...

  5. ps让图片背景透明

    效果图:  jpg=>png,背景透明 步骤: 1.选择橡皮工具的第三个  魔术橡皮 保存为png,    按住Ctrl+alt+shift+s    保存:

  6. linux磁盘之lsblk命令

    lsblk命令可以显示很多跟磁盘相关分区.所属关系以及lvm的重要信息,所以这个命令最好掌握.lsblk命令默认情况下将以树状列出所有块设备,包括查看磁盘挂载信息.lsblk命令包含在util-lin ...

  7. 12-factors

    12-factors 官方网址 The Twelve-Factor App 简介 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS).12-Factor 为构建如下的 ...

  8. InnoDB两次写

    partial page write问题: 默认情况下,innodb的一个页面时16k大小,其数据校验也是针对这16k来校验的,将数据写入磁盘是以页面为单位的.文件系统是以4k为单位写入的,机械磁盘是 ...

  9. 2021.07.23 P2474 天平(差分约束)

    2021.07.23 P2474 天平(差分约束) [P2474 SCOI2008]天平 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 已知A,B和每两个点点权,求点权i, ...

  10. java 中为什么重写 equals 后需要重写 hashCode

    本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ...