Golnag标准包之os包

通过os的包结构可以看到os支持的功能主要有以下几种

  • exec,可执行主机上的命令,以及与进程相关
  • signal,传输系统信号
  • user,与用户、用户组管理相关
  • dir,与文件目录相关
  • env,与环境变量相关
  • error,一些系统常用的error
  • file,文件操作相关
  • path,路径目录相关
  • state,文件目录状态

例如获取hostname

1
hostname, err := os.Hostname()

环境变量

获取环境变量

1
2
3
4
5
6
7
8
9
10
// 获取所有环境变量
environ := os.Environ()
// 获取某个环境变量
environ := os.Getenv("GOPATH")
// 设置环境变量
os.Setenv("name", "abc_code")
os.ExpandEnv("$NAME lives in ${BURROW}.") // 输出替换环境变量之后的字符串
val, ok := os.LookupEnv(key) // 环境变量是否存在
os.Clearenv() // 清除所有环境变量
os.Unsetenv("TMPDIR") // 清除指定环境变量

用户用户组

获取当前程序调用者的信息

1
2
3
4
5
6
7
8
os.Getgid()                        
os.Getuid()
os.Getgroups()
os.Getppid() // 获取父进程id

os.UserConfigDir() // 当前调用用户的配置目录
os.UserCacheDir() // 缓存目录
os.UserHomeDir() // 家目录

获取用户信息

1
2
3
4
5
6
7
8
9
10
11
u, _ := user.Current()
fmt.Println(u.Name) // 登录名
fmt.Println(u.Uid)
fmt.Println(u.Gid)
fmt.Println(u.HomeDir)
fmt.Println(u.Username) // 用户名

Lookup(username string) (*User, error) // 通过用户名称查询用户
LookupGroup(name string) (*Group, error) // 通过用户组名称查询
LookupId(uid string) (*User, error) // 通过用户id查询
LookupGroupId(gid string) (*Group, error) // 通过用户组id查询

执行一个命令

1
2
cmd := exec.Command("code")    // 例如启动vscode
err := cmd.Run() // 运行

获取运行的进程相关信息

1
2
3
4
5
6
7
8
cmd := exec.Command("code")
cmd.Run()
fmt.Println(cmd.Env) // 进程的环境变量
fmt.Println(cmd.Process.Pid) // 进程Pid
fmt.Println(cmd.Path) // 程序路径
fmt.Println(cmd.ProcessState.String()) // 进程状态
fmt.Println(cmd.ProcessState.Pid()) // 进程Pid
cmd.Process.Kill() // 杀死进程
1
2
3
4
5
6
7
8
cmd.Run()                        // 其实是Start和Wait方法实现的。

func (c *Cmd) Run() error {
if err := c.Start(); err != nil { // 命令运行,不等待执行结果
return err
}
return c.Wait() // 等待命令完成
}

获取命令路径

1
2
3
4
5
6
7
8
9
path, err := exec.LookPath("go")
if err != nil {
fmt.Println("no find")
return
}
fmt.Println(path)

// 获取当前路径
dir, err := os.Getwd()

系统报错

系统报错定义了一些常见的报错,判断时,可以通过是否相等来判断报错内容

1
2
3
4
5
6
7
8
9
ErrInvalid = fs.ErrInvalid // "invalid argument"

ErrPermission = fs.ErrPermission // "permission denied"
ErrExist = fs.ErrExist // "file already exists"
ErrNotExist = fs.ErrNotExist // "file does not exist"
ErrClosed = fs.ErrClosed // "file already closed"

ErrNoDeadline = errNoDeadline() // "file type does not support deadline"
ErrDeadlineExceeded = errDeadlineExceeded() // "i/o timeout"

文件操作

创建目录、文件,删除目录、文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
os.Create("1.txt")        // 创建文件
os.Open("1.txt") // 打开文件
os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755) // 以某个权限打开文件,O_CREATE代表文件不存在,则创建

os.TempDir() // 返回临时目录

stat, err := os.Stat("1.txt") // 获取文件信息
stat.IsDir() // 是否是目录
stat.Name() // 文件名
stat.Mode() // 文件权限
stat.Size() // 文件大小,单位byte
stat.ModTime() // 修改时间
stat.Sys() // 文件信息基础数据源

Mkdir(name string, perm FileMode) error // 创建目录
MkdirAll(path string, perm FileMode) error // 创建多层级目录
Chdir(dir string) error // 修改当前工作目录
Chmod(name string, mode FileMode) error // 修改文件权限
Chown(name string, uid int, gid int) error // 修改文件所属者所属组
Chtimes(name string, atime time.Time, mtime time.Time) error // 修改文件读取时间、修改时间

进程操作

1
2
3
4
5
6
7
8
9
os.Exit(-1)     // 结束当前进程
FindProcess(pid int) (*Process, error) // 根据pid获取进程信息
StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error) // 创建一个子进程
// 例如
process, err := os.StartProcess("/bin/ls", []string{"-l"}, &os.ProcAttr{})
(p *Process) Kill() error // 杀死此进程
(p *Process) Signal(sig Signal) error // 发送信号给进程
(p *Process) Wait() (*ProcessState, error) // 等待进程退出,返回进程信息
(p *Process) Release() error // 释放进程资源,在未调用Wait时使用,释放资源之后,进程后续无法运行

ProcessState 进程信息相关操作

1
2
3
4
5
6
7
8
9
fmt.Println(processState.ExitCode())            // 结束码
fmt.Println(processState.Pid()) // 进程pid
fmt.Println(processState.Exited()) // 进程是否退出
fmt.Println(processState.Sys()) // 返回有关进程的系统相关退出信息。将其转换为适当的基础类型,
fmt.Println(processState.Success()) // 进程是否运行成功
fmt.Println(processState.UserTime()) // 进程运行花费的用户时间
fmt.Println(processState.SystemTime()) // 进程运行花费的系统时间
fmt.Println(processState.String()) // 打印进程结束时的输出
fmt.Println(processState.SysUsage()) // 返回有关已退出进程的系统相关资源使用信息。将其转换为适当的基础类型,