Mac 应用程序调用 shell 脚本杀死自己
Mac app call shell script kill self
我写了一个mac应用程序。我调用 shell 脚本在我的 mac 应用程序中执行一些任务。当 shell 脚本任务完成时,我想终止我的 mac 应用程序并重新打开它。
我可以在 shell 脚本中 pgrep [app_name] | xargs kill -9
。但它不起作用。
当我在我的终端中执行这个命令时,它起作用了。如何在我的 shell 脚本中终止我的 mac 应用程序?希望能帮到你。
尝试做:
/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 }'`" >> $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 }'` == "$PID" ]]; then
echo 'killing with sudo (requires pass)'
sudo /bin/kill -9 $PID
fi
if [[ `ps $PID | grep $PID | grep -v grep | awk '{ print }'` == "$PID" ]]; then
echo 'killing with killall -9'
/usr/bin/killall -9 $APP
fi
done >> $LOG
我之前遇到过没有被脚本杀死的问题,结果发现没有为 pkill 或 kill 明确指定二进制路径 - 因为它们位于不同的文件夹中,有时一个有效,另一个无效' 取决于在 运行 运行时哪些环境变量在起作用。
要重新启动您的应用程序,您需要清楚它是什么应用程序,它是由二进制启动的还是由java启动的,以及在检查过程时是否指定了任何配置参数因为它同时 运行ning 即 运行 'ps ax ' 并查看是否有任何内容 运行ning
像这样:
/usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.pid
..因为当你重新启动时你需要包含相同的东西所以你会在脚本中做这样的事情:
/usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.pid > /dev/null 2>&1
..另一种选择是通过 launchd 将应用程序变成守护进程,然后您可以简单地停止并 restart\stop\start 该过程:
http://blog.frd.mn/how-to-set-up-proper-startstop-services-ubuntu-debian-mac-windows/
我写了一个mac应用程序。我调用 shell 脚本在我的 mac 应用程序中执行一些任务。当 shell 脚本任务完成时,我想终止我的 mac 应用程序并重新打开它。
我可以在 shell 脚本中 pgrep [app_name] | xargs kill -9
。但它不起作用。
当我在我的终端中执行这个命令时,它起作用了。如何在我的 shell 脚本中终止我的 mac 应用程序?希望能帮到你。
尝试做:
/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 }'`" >> $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 }'` == "$PID" ]]; then
echo 'killing with sudo (requires pass)'
sudo /bin/kill -9 $PID
fi
if [[ `ps $PID | grep $PID | grep -v grep | awk '{ print }'` == "$PID" ]]; then
echo 'killing with killall -9'
/usr/bin/killall -9 $APP
fi
done >> $LOG
我之前遇到过没有被脚本杀死的问题,结果发现没有为 pkill 或 kill 明确指定二进制路径 - 因为它们位于不同的文件夹中,有时一个有效,另一个无效' 取决于在 运行 运行时哪些环境变量在起作用。
要重新启动您的应用程序,您需要清楚它是什么应用程序,它是由二进制启动的还是由java启动的,以及在检查过程时是否指定了任何配置参数因为它同时 运行ning 即 运行 'ps ax ' 并查看是否有任何内容 运行ning 像这样: /usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.pid
..因为当你重新启动时你需要包含相同的东西所以你会在脚本中做这样的事情:
/usr/sbin/xinetd -dontfork -pidfile /var/run/xinetd.pid > /dev/null 2>&1
..另一种选择是通过 launchd 将应用程序变成守护进程,然后您可以简单地停止并 restart\stop\start 该过程: http://blog.frd.mn/how-to-set-up-proper-startstop-services-ubuntu-debian-mac-windows/