通过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()) // 返回有关已退出进程的系统相关资源使用信息。将其转换为适当的基础类型,
|