使用Bash按进程名称检查Mac进程是否正在运行

时间:2009-11-30 19:30:21

标签: macos bash unix process

如何使用Bash脚本中的进程名称检查Mac OS X上的进程是否正在运行?

我正在尝试编写一个Bash脚本,如果它已经停止,它将重新启动一个进程,但如果它仍在运行则不执行任何操作。

10 个答案:

答案 0 :(得分:29)

解析这个:

ps aux | grep [-i] $ProcessName | wc -l

......可能是你最好的选择。这是一个简短的脚本,可以完成您的工作:

#!/bin/bash
PROCESS=myapp
number=$(ps aux | grep $PROCESS | wc -l)

if [ $number -gt 0 ]
    then
        echo Running;
fi

编辑:我最初向-i添加了grep标记,以使其不区分大小写;我这样做是因为我尝试的示例程序是python,在Mac OS X上以Python运行 - 如果您完全了解应用程序的情况,则-i不是必需的。

这种方法的优势在于它可以随您扩展 - 将来,如果您需要确保应用程序的五个实例正在运行,那么您已经在计算。唯一需要注意的是,如果另一个应用程序在其命令行中有您的程序名称,它可能会出现 - grep的正则表达式将解决该问题,如果您很狡猾(并遇到此问题)。

研究psgrepwc的Darwin手册页。

答案 1 :(得分:25)

更短的解决方案:

if pgrep $PROCESS_NAME; then
    echo 'Running';
fi

说明:

如果正在运行的进程匹配pgrep,则

$PROCESS_NAME退出0,否则与1存在 if检查pgrep的退出代码,并且就退出代码而言,0表示成功。

答案 2 :(得分:11)

另一种方法是使用(滥用?)-d命令的killall选项。 -d选项实际上不会终止进程,而是打印将要执行的操作。如果找到匹配的流程,它也会以状态0退出,如果找不到,则退出1。把它放在一起:

#!/bin/bash
`/usr/bin/killall -d "$1" &> /dev/null`
let "RUNNING = ! $?"     # this simply does a boolean 'not' on the return code
echo $RUNNING

为了给予应有的信用,我最初从iTunes安装程序中的脚本中提取了这项技术。

答案 3 :(得分:5)

这个简单的命令可以解决问题。进程名称周围的括号可防止grep命令显示在进程列表中。请注意逗号后面没有空格。可能存在一些可移植性问题,因为某些unix系统上的 ps 可能需要在选项之前使用破折号:

ps axo pid,command | grep "[S]kype"

优点是您可以在if语句中使用结果:'

if [[ ! $(ps axo pid,command | grep "[i]Tunes.app") ]]; then
    open -a iTunes
fi

或者如果你喜欢这种风格:

[[ ! $(ps axo pid,command | grep "[S]kype") ]] && open -a Skype  || echo "Skype is up"

另一个优点是你可以通过向awk'{print $ 1}'添加管道来获得pid。

echo "iTunes pid: $(ps axo pid,command | grep "[i]Tunes.app" | awk '{print $1}')"

答案 4 :(得分:3)

您可以使用killall或kill,具体取决于您是尝试通过PID还是按名称查找任务。

按姓名:

if ! killall -s -0 $PROCESS_NAME >/dev/null 2>&1; then
  # Restart failed app, or do whatever you need to prepare for starting the app.
else
  at -f $0 +30seconds # If you don't have this on cron, you can use /usr/bin/at
fi

通过PID:

if ! kill -0 $PID 2>/dev/null; then
  # Restart app, do the needful.
else
  at -f $0 +30seconds
fi

如果查看 OSX手册,您将看到一组不同的流程管理命令;因为它不是Linux内核,所以他们以不同的方式管理流程是有道理的。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/killall.1.html

我的终端输出的样本(当然是用户名和主机名):

user@localhost:~$ kill -0 782 # This was my old, stale SSH Agent.
bash: kill: (782) - No such process
user@localhost:~$ echo $?
1

user@localhost:~$ kill -0 813 # This is my new SSH agent, I only just created.
user@localhost:~$ echo $?
0

来自kill -0的返回代码将始终以安全的方式检查进程是否正在运行,因为-0不会发送任何将由应用程序处理的信号。它不会杀死应用程序,“kill”只被称为“kill”,因为它通常用于停止应用程序。

当你查看它在源代码中使用的接口时,你会发现它实际上是直接与进程表交互(而不是从ps中获取可能加载的输出),只是向应用程序发送信号。某些信号表示应用程序应该关闭或停止,而其他信号则表示应用程序重新启动服务,或重新读取配置,或重新打开文件描述符以记录最近轮换的文件。 “kill”和“killall”可以做很多事情,不会终止应用程序,并且经常使用它来简单地向应用程序发送信号。

答案 5 :(得分:2)

我缺乏对上面的killall答案发表评论的声誉,但是killall -s没有发出任何信号就这样做了:

killall -s "$PROCESSNAME" &> /dev/null
if [ $? -eq 0 ]; then
    echo "$PROCESSNAME is running"
    # if you also need the PID:
    PID=`killall -s "$PROCESSNAME" | awk '{print $3}'`
    echo "it's PID is $PID"
fi

答案 6 :(得分:1)

我已经在网上扩展了一个pidof脚本来使用正则表达式(通常是子串)并且不区分大小写

#!/bin/sh
ps axc  |awk "BEGIN{ n=tolower(\"$1\")}\
    tolower(\$5) ~n {print  \$1}";

只需使用此内容创建一个名为“pidof”的脚本,并将其放在您的路径中,即在其中一个目录中

echo $PATH

并使其可执行(可能使用sudo)

chmod 755 /usr/local/bin/pidof

并且像这样使用它,当然

kill -9 `pidof pyth`

答案 7 :(得分:0)

Mac有pidof吗? ...

if pidof $processname >/dev/null ; then echo $processname is running ; fi

答案 8 :(得分:0)

这是肯定的!

pgrep,pkill和pfind for OpenBSD和Darwin(Mac OS X)

http://proctools.sourceforge.net

(也可通过MacPorts提供:端口信息proctools)

pidof by nightproductions.net

答案 9 :(得分:0)

对于OP来说可能为时已晚,但这可能会帮助其他人找到这个帖子。

以上对amrox主题的修改非常适合在我的OS X上重启应用程序:

killall -d TextEdit &> /dev/null && killall TextEdit &> /dev/null; open -a TextEdit

我使用以下AppleScript来更新和重启守护进程:

tell application "System Events" to set pwd to POSIX path of container of (path to me)
do shell script "launchctl unload -w /Library/LaunchDaemons/time-test.plist; cp -f " & quoted form of pwd & "/time-test.plist /Library/LaunchDaemons; launchctl load -w /Library/LaunchDaemons/time-test.plist" with administrator privileges

它假定原始或更新的plist文件与AppleScript位于同一目录中。