golang爬坑:操作Linux命令

  通常在启动项目服务程序的时候,需要判断该服务是否已经被启动,一般的做法有两种,其一是每次启动后将pid写入文件中,启动的时候读取这个文件,如果里面有数值,就表示服务已启动;另一种是通过shell命令查找:

ps -ef | grep XXX | grep -v grep | awk ‘{print $2}‘

很多语言都可以直接执行这行命令;偏偏go语言不行,因此,我们可以利用go中提供的一些方法实现它(不说了,直接上代码):

func Pipeline(cmds ...*exec.Cmd) (pipeLineOutput, collectedStandardError []byte, pipeLineError error) {
	if len(cmds) < 1 {
		return nil, nil, nil
	}

	var output bytes.Buffer
	var stderr bytes.Buffer

	last := len(cmds) - 1
	for i, cmd := range cmds[:last] {
		var err error
		if cmds[i+1].Stdin, err = cmd.StdoutPipe(); err != nil {
			return nil, nil, err
		}
		cmd.Stderr = &stderr
	}

	cmds[last].Stdout, cmds[last].Stderr = &output, &stderr

	for _, cmd := range cmds {
		if err := cmd.Start(); err != nil {
			return output.Bytes(), stderr.Bytes(), err
		}
	}

	for _, cmd := range cmds {
		if err := cmd.Wait(); err != nil {
			return output.Bytes(), stderr.Bytes(), err
		}
	}

	return output.Bytes(), stderr.Bytes(), nil
}

func ExecPipeLine(cmds ...*exec.Cmd) (string, error) {
	output, stderr, err := Pipeline(cmds...)
	if err != nil {
		return "", err
	}

	if len(output) > 0 {
		return string(output), nil
	}

	if len(stderr) > 0 {
		return string(stderr), nil
	}
	return "", errors.New("no returns")
}

 接着写一个例子测试:

func main() {
    cmds := []*exec.Cmd{
        exec.Command("ps", "-ef"),
        exec.Command("grep", "redis"),
        exec.Command("grep", "-v", "grep"),
        exec.Command("awk", "{print $2}"),
    }
    string, _ := pipeutil.ExecPipeLine()
    fmt.Printf("pids: %v", string)
}

  Bingo!切记,最后一行 awk的参数不能有单引号(‘’)(当时被坑惨了。。。)

 

时间: 2024-10-09 13:25:48

golang爬坑:操作Linux命令的相关文章

SSH操作linux命令

一.Linux下重启Tomcat 进入tomcat下的bin目录:cd /user/standard/tomcat/bin; 使用关闭命令:./shutdown.sh; 查看Java进程是否关闭:ps -ef|grep java; 可以直接杀死进程:    kill -9 7010 启动tomcat:./startup.sh; 查看实时日志: 切换到:cd usr/local/tomcat5/logs: tail -f catalina.out; 退出实时日志:Ctrl+c 查看日志:tail

Ubuntu 常用操作linux命令(每日更新)

所有命令方法均为 rock 度娘归纳总结,仅为了方便大家查询使用.也欢迎大家留言补充! 1.U盘格式化: 先卸载-->格式化 # fdisk -l  //查看分区,u盘的序号 # sudo umount /dev/sdb4   //卸载U盘(/dev/sdb4) 对于u盘我们一般格式化为FAT格式或者FAT32格式,不过在linux下这些会都显示为FAT格式.我们只需要执行命令: # sudo mkfs.vfat -F 32 /dev/sdb4  //u盘格式化为fat32格式

golang爬坑:一个简单的http内网转发

最近有一个需求,就是需要从内网服务器的一个端口请求数据,问题是这个内网端口不能被外网访问到,所以需要做一个转发代理服务.原理就是当请求到达时,将本机的地址替换成目标地址,然后其他格式不变,待目标请求返回后,又将目标的报文头及报文返回给客户端.具体代码如下: func main() { localHost := "127.0.0.1:9001" targetHost := "127.0.0.1:8001" httpsServer(localHost, targetHo

Linux命令行之逗趣无极限

Linux命令行之逗趣无极限 1. Linux"sl"命令行 尽管"sl"代表了"蒸汽机机头",但它是用来提醒那些命令行控们别把"ls"打成了"sl".让我们看看在系统中运行这个命令的时候会怎样. 首先,我们安装的时候,要将其设置为不与标准Linux一起出现.用"apt-get"可以很方便地完成安装. sudo apt-get install sl 大部分的安装需要sudo特权.完成安装

kali linux安装virtualbox虚拟机之爬坑经历

很多kali爱好者想把kali linux作为系统使用,但是有些win下的程序有时候也需要用到,此时需要虚拟机. kali系统在安装虚拟机的时候也会遇到一大堆坑,接下来是我的爬坑过程. 一波三折. 环境 :kali linux 2.0 32位 软件 :virtualbox 虚拟机 0x01  bash: /etc/init.d/vboxdrv: 没有那个文件或目录 安装了virtualbox后出现的问题之一最常见的就是内核问题 网上大多数人的问题都是执行下面的命令 出现如下提醒.然而网上五花八门

Linux命令行基础 、 基础命令操作 、 目录文件基本操作

  Linux命令行基础 基础命令使用 目录和文件基本管理 #################################################   一.Linux命令行基础   1. 什么是命令.命令行    命令:能够被Linux系统识别,用来完成某一类功能的指令或程序                           |--> 依赖于Shell解释器,查看:cat/etc/shells 默认为 /bin/bash    命令行:用户输入的命令及相关参数,按Enter键提交的

github linux 命令行操作实例

继续整理一下linux 下面使用命令行操作实例 首先创建文件目录 然后 执行 git clone 操作 [email protected]:~/桌面$ cd test/ [email protected]:~/桌面/test$ git clone https://github.com/timelessz/TESTDEMO.git正克隆到 'TESTDEMO'...remote: Counting objects: 3, done.remote: Total 3 (delta 0), reused

Linux命令高效操作(2)-妙用历史命令

本希望把Linux高效操作这一个系列文章命名为unix-like命令高效操作,但是后来发现本人并没有在多数的unix-like平台实践过.本着实践第一的精神,就不把话题扯那么大了,决定更名为"linux命令高效操作",哈哈.废话不多说,我的实验系统:Linux之centos7. 今天我想聊的是每个用过Linux命令操作的同学或许都知道的一个存在:历史命令.什么是历史命令呢?通俗简单的说,就是你执行过的命令的历史.大家最常见的用处就是使用上下方向键进行命令的切换喽!刚接触命令行操作的同学

LINUX命令行操作

Linux 命令行快捷键 7条回复 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 说明 Ctrl – k: 先按住 Ctrl 键,然后再按 k 键: CAlt – k: 先按住 Alt 键,然后再按 k 键: M – k:先单击 Esc 键,然后再按 k 键. 移动光标 Ctrl – a :移到行首 Ctrl – e :移到行尾 Ctrl – b :往回(左)移动一个字符 Ctrl – f :往后(右)移动一个字