要获取最后修改文件的进程信息,你可以使用系统调用来实现。在Linux上,可以使用inotify
机制来监视文件系统事件,并获取相关信息。
下面是一个修改后的示例代码,包括了获取最后修改文件的进程信息:
package main
import (
"fmt"
"log"
"os"
"os/exec"
"time"
"github.com/fsnotify/fsnotify"
)
func monitorFile(filename string) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
err = watcher.Add(filename)
if err != nil {
log.Fatal(err)
}
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Op&fsnotify.Write == fsnotify.Write {
fmt.Println("File modified:", event.Name)
out, err := exec.Command("lsof", "-b", "-n", "-t", "--", event.Name).Output()
if err != nil {
log.Fatal(err)
}
pid := string(out[:len(out)-1])
out, err = exec.Command("ps", "-p", pid, "-o", "comm=").Output()
if err != nil {
log.Fatal(err)
}
processName := string(out[:len(out)-1])
fmt.Println("Last modified by process:", processName)
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
log.Println("error:", err)
}
}
}
func main() {
filename := "test.txt" // 需要监控的文件名
go monitorFile(filename)
// 主程序可继续执行其他任务
select {}
}
在修改后的monitorFile
函数中,我们添加了对fsnotify.Write
事件的处理。当文件被修改时,会打印相应的信息,并通过执行lsof
命令获取最后修改文件的进程ID。然后,使用ps
命令根据进程ID获取进程名称,并将其打印出来。
请注意,你需要确保操作系统上已安装并配置了正确的命令行工具(如lsof
和ps
),以便能够在Go代码中调用它们。此外,请根据你的实际需求进行适当的错误处理和资源管理。
内容由零声教学AI助手提供,问题来源于学员提问