我写了一个mac应用程序。我调用shell脚本在我的mac应用程序中执行一些任务。当shell脚本任务完成时,我想杀死我的mac应用程序并重新打开它。
我可以在shell脚本中pgrep [app_name] | xargs kill -9
。但它不起作用。
当我在终端中执行此命令时,它可以工作。如何在我的shell脚本中杀死我的mac应用程序?希望你能帮忙。
答案 0 :(得分:1)
尝试做:
/usr/bin/pkill -9 <app name>
如果失败了,如果应用程序产生多个prcesses:
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&gt;&amp; 1
..另一个选项是通过launchd将应用程序转换为守护进程然后你可以简单地停止并重新启动\ stop \启动进程: http://blog.frd.mn/how-to-set-up-proper-startstop-services-ubuntu-debian-mac-windows/