如果我具有流程的PID,则os.FindProcess是否足以测试该流程的存在?我的意思是,如果返回err
,我是否可以认为它已终止(或被杀死)?
编辑:
我刚刚写了一个包装函数kill -s 0
(旧式bash流程测试)。这可以正常工作,但是如果有其他解决方案(使用go库完成),我仍然很高兴。
func checkPid(pid int) bool {
out, err := exec.Command("kill", "-s", "0", strconv.Itoa(pid)).CombinedOutput()
if err != nil {
log.Println(err)
}
if string(out) == "" {
return true // pid exist
}
return false
}
这是查看进程是否处于活动状态的传统的Unix方式-向其发送0信号(就像您对bash示例所做的一样)。
来自kill(2)
:
If sig is 0, then no signal is sent, but error checking is still
per‐
formed; this can be used to check for the existence of a process ID
or
process group ID.
并翻译成Go
package main
import (
"fmt"
"log"
"os"
"strconv"
"syscall"
)
func main() {
for _, p := range os.Args[1:] {
pid, err := strconv.ParseInt(p, 10, 64)
if err != nil {
log.Fatal(err)
}
process, err := os.FindProcess(int(pid))
if err != nil {
fmt.Printf("Failed to find process: %s\n", err)
} else {
err := process.Signal(syscall.Signal(0))
fmt.Printf("process.Signal on pid %d returned: %v\n", pid, err)
}
}
}
当您运行它时,您将得到此消息,表明进程123已死,进程1处于活动状态,但不属于您,进程12606处于活动状态,由您拥有。
$ ./kill 1 $$ 123
process.Signal on pid 1 returned: operation not permitted
process.Signal on pid 12606 returned: <nil>
process.Signal on pid 123 returned: no such process
问题内容: 给定Linux进程的pid,我想从C程序检查该进程是否仍在运行。 问题答案: 发出信号作为系统调用。如果调用成功,则表示存在具有此pid的进程。 如果调用失败并设置为,则不存在具有此类pid的进程。 引用POSIX标准: 如果sig为0(空信号),则执行错误检查,但实际上未发送任何信号。空信号可用于检查pid的有效性。 请注意,您在竞争条件下并不安全:目标进程可能已退出,并且与此同时已
问题内容: 作为构建穷人看门狗并确保应用程序崩溃的一种方法(直到我弄清原因),我需要编写一个PHP CLI脚本,该脚本将由cron每5百万次运行一次,以检查该进程仍在运行。 基于此页面,我尝试了以下代码,但是即使我使用虚假数据对其进行调用,它也始终返回True: 接下来,我尝试了这段代码 … …但是没有达到我的期望: FWIW,此脚本与PHP 5.2.5的CLI版本一起运行,并且操作系统为uCli
问题内容: 我有一个嵌入了数据库的桌面应用程序。当我执行程序时,我需要检查特定的表是否存在,如果不存在则创建它。 给我的数据库一个名为conn的Connection对象,我该如何检查呢? 问题答案: 您可以使用可用的元数据: 有关更多详细信息,请参见此处。还要注意JavaDoc中的注意事项。
问题内容: 我正在尝试检查$ _POST是否存在,如果存在,则在另一个字符串中打印它,如果不存在,则根本不打印。 像这样的东西: 任何帮助将是巨大的! 问题答案:
问题内容: 我正在尝试检查是否存在用户默认值,如下所示: 但是,无论对象还不存在,它将始终返回true是什么?这是检查存在的正确方法吗? 问题答案: 阿斯通有一个很好的答案。请参阅下面的Swift 3版本。
问题内容: 检查cookie是否存在的好方法是什么? 条件: Cookie存在,如果 如果不存在Cookie, 问题答案: 您可以使用所需cookie的名称调用函数getCookie,然后检查其是否为null。