【问题标题】:Mac app call shell script kill selfMac app调用shell脚本kill self
【发布时间】:2016-04-06 09:19:10
【问题描述】:

我编写了一个 mac 应用程序。我调用一个 shell 脚本在我的 mac 应用程序中执行一些任务。当 shell 脚本任务完成时,我想杀死我的 mac 应用程序并重新打开它。

我可以在 shell 脚本中pgrep [app_name] | xargs kill -9。但它不起作用。

当我在终端中执行此命令时,它可以工作。如何在我的 shell 脚本中杀死我的 mac 应用程序?希望你能帮忙。

【问题讨论】:

  • 我想知道如何在代码中重新启动一个 mac 应用程序。

标签: macos shell kill


【解决方案1】:

尝试做:

/usr/bin/pkill -9 <app name>

如果失败,并且应用程序产生多个进程:

for PID in $(/usr/bin/pgrep <app name>); do /bin/kill -9 $PID; done

如果进程以 root 身份运行,您需要以 root 身份或使用 sudo 运行脚本。

如果您仍然在苦苦挣扎,请执行以下操作来帮助您调试:

#!/bin/bash

APP='<appname>'
LOG= ~/debugkill.log
PIDS: `/usr/bin/pgrep $APP`

echo -e "`/bin/date`: Script running as user: `/usr/bin/whoami` \n
  Process to be killed owned by: `ps u $APP | /usr/bin/awk { print $1 }'`" >> $LOG

echo -e "PIDs to terminate: $PIDS >> $LOG
echo -e "Killing PIDs..." 
for PID in $PIDS; do
  /bin/kill -9 $PID
  if [[ `ps $PID | grep $PID | grep -v grep | awk '{ print $1 }'` == "$PID" ]]; then
    echo 'killing with sudo (requires pass)'
    sudo /bin/kill -9 $PID
  fi

  if [[ `ps $PID | grep $PID | grep -v grep | awk '{ print $1 }'` == "$PID" ]]; then
    echo 'killing with killall -9'
    /usr/bin/killall -9 $APP
  fi
done >> $LOG

我之前遇到过没有被脚本杀死的问题,结果发现二进制路径没有为 pkill 或 kill 明确指定 - 因为它们位于不同的文件夹中,有时一个有效而另一个无效取决于运行它时哪些环境变量在起作用。

要重新启动您的应用程序,您需要清楚它是什么应用程序,它是由二进制文件启动还是由 java 或其他东西启动,以及在运行时检查进程时是否指定了任何配置参数,即运行'ps ax' 看看是否有任何东西在运行 像这样: /usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.pid

..当您重新启动时,您需要包含相同的内容,因此您可以在脚本中执行类似的操作:

/usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.pid > /dev/null 2>&1

..另一种选择是通过launchd将应用程序变成守护程序,然后您可以简单地停止并重新启动\停止\启动进程: http://blog.frd.mn/how-to-set-up-proper-startstop-services-ubuntu-debian-mac-windows/

【讨论】:

  • 它不起作用。该命令类似于pgrep [app_name] | xargs kill -9。它只适用于终端。
  • 使用正确指定的二进制文件的路径再试一次,并尝试使用超级用户,看看它是否有所作为。确保在脚本顶部有 #!/bin/bash 或 #!/usr/bin/env bash。我将编辑脚本,向您展示一些有用的调试技巧。
  • 非常感谢?。 pgrep [name] 在我的脚本中一无所获。所以我把它改成`ps -A | grep [name]' ,然后我调用 'kill -9 $pid'。现在可以了。