我如何调查是否已经运行名为 /root/dodo/dodo 的程序

我如何调查是否已经运行名为 /root/dodo/dodo 的程序

我如何调查是否已经运行名为 /root/dodo/dodo 的程序? 但我需要直接从程序运行扫描,进行测试。 谢谢...

file /root/todo/todo

#!/bin/bash
if [ check run program /root/todo/todo ]
then
  exit
else
  #continued
fi

答案1

您可以检查该过程并查看是否有如您所指示的名称:

$ ps aux | grep "/root/dodo/dodo"

如果你需要在 Bash 脚本中进行测试,

ps aux | grep -v "grep" | grep -q "/root/dodo/dodo"
if [ $? -eq 0 ]; then
   # do stuff if it is running
else
   # do stuff if it is not running
fi

答案2

如果您想知道名为 /root/dodo/dodo 的程序是否正在运行,请使用以下命令:

ps eaf | grep /root/dodo/dodo

答案3

似乎您想要编写一个 shell 脚本来确保只有一个实例(进程)运行它。

然后看看这个问题并考虑使用lockfile(1)

答案4

实际上,您可能需要扫描所有正在运行的 bash 进程并检查它们运行了什么脚本(至少在我的 bash 中,这始终是文件描述符 255)。

以下内容在可移植性和长期可用性方面可能有点脆弱,但它可以暂时解决您的问题。

#!/bin/bash

declare -i running

cmd=$(readlink -f "${0}")

while true ; do
    running=0
    pids=( $(pidof bash) )

    for p in "${pids[@]}" ; do
        script=$(readlink -f /proc/${p}/fd/255 2>/dev/null)
        if [ "${script}" = "${cmd}" ] ; then
            running+=1
        fi
    done

    echo "running ${running} times.. this is $$.."
    sleep 1
done

退出逻辑尚未实现..它只是循环计算正在运行的进程数..8)应该很容易采用..

这会引入一些竞争条件(每个解决方案都可能如此),因为如果你有 2 个正在运行的实例,它们都可能正在检查并决定退出,因为它们已经在运行..8)

需要读取链接来解析任何符号链接。如果脚本由另一个名称启动(具有另一个名称的符号链接),则可能需要这样做。

实际上我会通过文件锁定和/或创建 pid 文件来解决这个问题。

相关内容