最近在接触Linux的一些东西。对于一直使用windows系统的人来说初次接触Linux简直头痛到不行。还好,时间较长,自己也慢慢了解了一些。
项目现在是有客户端,服务组成。服务其实也是客户端的一种辅助工具,都是放在本地机器运行。需求是要在客户端里启动某个服务(Java写的)。其实原理和windows的cmd执行命令差不多。我在谷歌搜到的利用c#的Process类来启动Linux的终端(Termianl)(这里要称赞下unity的跨平台性太舒服了),然后在程序中输入我们想要执行的命令。代码如下:
public static string ExecuteCommand(string command)
{
Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "/bin/bash";
proc.StartInfo.Arguments = "-c \" " + command + " \"";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
return proc.StandardOutput.ReadLine();
}
return "没有信息";
}
我们在启动服务函数出调用此函数并且输入我们要执行的命令。这里说下,由于我们需要关闭服务,所以我们需要记住服务的PID。所以我们在启动服务的时候还要将改服务PID记录到本地文件中。由于服务放在客户端里,所以我就将保存的PID文件保存到本地目录下。在LINUX下用./表示当前目录下。
public void StartServer()
{
//两个执行命令中间一定要加& 表示同时执行两个命令 不然不会将PID记录本地
text.text= CmdHelper.ExecuteCommand(@"java -jar data-0.0.1-SNAPSHOT.jar --server.port=60000 & echo $! >./SNAPSHOT.pid");
//java -jar data-0.0.1-SNAPSHOT.jar --server.port=60000 是我自己要启动服务的命令 可忽略
}
停止服务:
public void StopServer2()
{
text.text = CmdHelper.ExecuteCommand(@"PID=$(cat ./SNAPSHOT.pid)&& kill -9 $PID");
}
我这里在两个命令中间使用的两个&,表示只有获取到PID才会执行下一个命令。我查了相关资料,不同数量的符号有不同的意思。如下:
/// 执行cmd命令
/// 多命令请使用批处理命令连接符:
/// <![CDATA[
/// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
如果我们想查看所有进程占用情况,我们打开终端,输入:ps auxw
其中参数a表示显示系统中所有用户的的进程;u表示输出进程用户所属信息; x表示也显示没有控制台的进程;若显示行太长而被截断则可以使用f参数;
希望本博客对你有帮助。