【问题标题】:Android: init.d script to monitor and kill a processAndroid:init.d 脚本来监控和杀死一个进程
【发布时间】:2015-09-13 14:31:32
【问题描述】:

我在我的 nexus 5 上运行股票 android (5.1.1) 并尝试使用脚本来终止进程 (kill_process.sh)。

while true; do
    PROCESS=$(pgrep -l whatsapp)
    if [[ $PROCESS == *"whatsapp"* ]]; then
        kill $(pgrep -f whatsapp)
fi
done

我可以使用应用程序“Universal Init.d”让脚本在启动时运行,但这个特定的脚本似乎在启动时无法运行。只要我 ssh 进入我的手机并手动运行它,它就可以工作。例如,一旦我启动 whatsapp,它就会立即被杀死。

有没有人知道我可以做些什么来让它在启动时工作?
此外,while 循环可能不是执行此操作的最有效方式……因此欢迎提出任何想法。

编辑1: 将 if 语句更改为
case $PROCESS in *"whatsapp"*) kill $(pgrep -f whatsapp) esac

Edit2:有没有一种方法可以守护脚本?

Edit3:我设置了另一个脚本,只包含一行start-stop-daemon --exec /path_to_main_script/kill_process.sh -S。我只将新脚本放在/system/etc/init.d 目录中,而将kill_process.sh 脚本放在/system/etc/ 中的不同子目录中。这样,新脚本在启动时运行,然后调用 kill_process.sh 脚本。但它运行不稳定,这是由“Universal Init.d”应用程序引起的:当应用程序崩溃时,脚本停止运行。有什么想法吗?

【问题讨论】:

  • 至少,我会将true 替换为sleep 1。但不管你做什么,对电池都不好……

标签: android bash boot init.d


【解决方案1】:

免责声明:我从未使用过应用程序 Universal Init.d,也没有很多 Android 经验。但我在桌面上做了​​一些测试:

me:~$ bash -x /tmp/x
+ a=abcd
+ [[ abcd == *bc* ]]
+ echo 0
0  # correct

me:~$ dash -x /tmp/x
+ a=abcd
+ [[ abcd == *bc* ]]
/tmp/x: 3: /tmp/x: [[: not found
+ echo 127
127  # [[ not supported

me:~$ busybox sh -x /tmp/x
+ a=abcd
+ [[ abcd == *bc* ]]
+ echo 1
1  # wrong!

脚本:

a=abcd
[[ $a == *bc* ]]
echo $?

结论:您应该检查应用程序使用的外壳。 [[ 语法与 * 结合使用可能会失败。我认为那里是busybox或dash ...

为了节省电量,我建议至少将while true 替换为

while sleep 1; do

但这也只是一个 hack。您应该寻找基于事件的解决方案(无法帮助您)

【讨论】:

  • 我将 if 语句更改为 case $PROCESS in *"whatsapp"*) kill $(pgrep -f whatsapp) esac,虽然我认为这不是问题,因为我可以手动执行脚本,然后它就可以工作了...
  • 这个应用真的在后台运行脚本吗?初始化脚本通常不适合长期运行。他们通常只做短暂的动作并启动守护进程......脚本中的假守护进程可能如下所示:( while ...; do ... done; ) &
  • 该应用程序只是模拟 init.d 支持。我使用它是因为股票内核显然不支持 init.d。您的虚假守护程序想法似乎不起作用:我仍然可以运行一个应该被脚本杀死的应用程序。我需要再次手动运行脚本。基本上我需要的是一个进程监视器(然后是杀手),它在重启后仍然存在,即它在启动时启动。我只是尝试使用脚本来完成此操作,但也许有更好的方法?有没有办法守护脚本?还是写我自己的守护进程?
  • 我设法让脚本在启动时运行,但不幸的是它运行得不是很稳定。我设置了另一个包含一行的脚本:start-stop-daemon --exec /path_to_main_script/kill_process.sh -S。我只将新脚本放在/system/etc/init.d 目录中,而将kill_process.sh 脚本放在/system/etc/ 中的不同子目录中。这样,新脚本在启动时运行,然后调用 kill_process.sh 脚本。如前所述,它运行不稳定,这是由“Universal Init.d”应用程序引起的:当应用程序崩溃时,脚本停止运行。有什么想法吗?
  • 没有。我认为这是 android cgroup 系统,一旦不再需要它,它就会删除进程的所有内容。这通常是一件好事。您将不得不寻找为此目的制作的另一个应用程序或开发自己的应用程序。如果只是为了摆脱whatsapp,你可能想使用像Root App Deleter这样的东西
猜你喜欢
  • 2018-08-28
  • 2017-08-15
  • 2016-01-24
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2012-02-28
相关资源
最近更新 更多