如何杀死隐藏进程?

时间:2017-04-27 17:39:13

标签: c bash pid kill gnu-screen

我有以下脚本。

#!/bin/bash

if [ "$EUID" -ne 0 ]
  then
    echo '' 
    echo -e "\e[1;31m   Please run the script as root \e[0m"
    echo ''
  exit
fi

for run in {1..11}
do  
    echo -e '\e[1;32m   Initializing AP in backfround... \e[0m' 
    sudo screen -dmS hotspot
    sleep 5

    # start the AP in background
    echo -e '\e[1;32m   Starting AP in backfround... \e[0m'
    sudo screen -S hotspot -X exec ./start_hostapd.sh
    sleep 20

    # save PIDs for dmS
    ps -ef | grep "dmS" | awk '{print $2}' > dms.log
    sleep 1

    # save PIDs for hostapd
    ps -ef | grep "hostapd" | awk '{print $2}' > process.log
    sleep 1 

    echo -e '\e[1;33m   Running data... \e[0m'

    for run in {1..10}
    do  # send 10 times
        sudo /home/ubuntu/Desktop/send_data/run_data
        sleep 1
    done

    echo -e "\e[1;31m   Stopping sending... \e[0m"
    sleep 2

    echo -e "\e[1;31m   Quiting hotspot... \e[0m"
    sudo /home/ubuntu/Desktop/kill_dms/kill_dms
    sleep 5

    echo -e "\e[1;31m   Stopping AP... \e[0m"
    sudo /home/ubuntu/Desktop/kill_hostapd/kill_hostapd
    sleep 5

    echo -e '\e[1;31m   Wiping dead screens... \e[0m'
    echo
    sudo screen -wipe
    sudo screen -X -S hotspot quit
    sleep 5
done

我使用启动AP(hostapd)的bash脚本然后执行其他命令。不幸的是,一旦AP启动,下一行将不再执行。为避免此问题,在脚本中,我使用 screen 命令启动AP,该命令允许在后台运行AP,并且还允许执行下一行。

对于for循环中的每次迭代,必须重新启动AP。为此,我写出 screen hostapd 的PID,然后调用我的C程序,这些程序会终止这些进程。最后我再次使用 screen 命令确保后台的AP已经停止并且可以再次启动。

这种实施方式很有效。但是,当脚本结束并且所有进程已经被杀死时,AP会在其他设备中消失,几分钟后它会再次出现,并且会多次出现。只有系统重启才能完全停止AP。

我使用htop查找运行AP的进程。但是,我找不到这些流程。 htop说我没有使用上面脚本创建的进程。这是正确的,因为脚本一旦完成就会终止进程。

所以,我想我的AP有隐藏的进程,我看不到它们。有没有办法找到隐藏的进程并杀死它们以阻止AP?

当我刚在另一个终端启动AP然后我使用CTRL + C停止它时,AP将停止,我的设备不再看到它。

这就是为什么我认为屏幕启动一个隐藏的过程,htop或htop之类的其他程序无法找到它。

1 个答案:

答案 0 :(得分:1)

如果您根本不需要任何hostap流程,我宁愿使用pkill而不是信任pids的管理。最简单的用法应该是:

pkill -f hostap
pkill -f screen

如果您想使用其他信号,例如9,请使用:

pkill -9 -f hostap
pkill -9 -f screen

https://linux.die.net/man/1/pkill