Bash脚本不会杀死指定文件中的所有PID或允许输入部分名称

时间:2016-06-03 01:09:28

标签: bash kill

现在,我的bash脚本适用于1个PID进程,我必须使用精确的进程名称进行输入。它不会接受*firefox*' for example. Also, I run a bash script that opens multiple rsync`进程,我希望这个脚本能够杀死所有这些进程。但是,此脚本仅适用于具有1个PID的进程。

这是脚本:

#!/bin/bash

    createProcfile() {

    ps -eLf | grep -f process.tmp | grep -v 'grep' | awk '{print $2,$10}' | sort -u | egrep -o '[0-9]{4,}' > pid.tmp

#   pgrep "$(cat process.tmp)" > pid.tmp

    }

    PIDFile=pid.tmp

    echo "Enter a process name"
    read -r process
    echo "$process" > process.tmp

#   node_process_id=$(pidof "$process")
    node_process_id=$(ps -eLf | grep $process | grep -v 'grep' | awk '{print $2,$10}' | sort -u | egrep -o '[0-9]{4,}')
    if [[ -z "$node_process_id" ]]; then
            echo "Please enter a valid process."
        rm process.tmp
        exit 0
    fi

    ps -eLf | grep $process | awk '{print $2,$10}' | sort -u | grep -v 'grep'
#   pgrep "$(cat process.tmp)"

    echo "Would you like to kill this process(es)? (y/n)"
    read -r answer

    if [[ "$answer" == y ]]; then

        createProcfile
        pkill -F "$PIDFile"
        rm "$PIDFile"
        sleep 1
        createProcfile

        node_process_id=$(pidof "$process")
        if [[ -z $node_process_id ]]; then
                echo "Process terminated successfully."
            rm process.tmp
            exit 0
        else
            echo "Process not terminated. Kill process manually."
            ps -eLf | grep $process | awk '{print $2,$10}' | sort -u | grep -v 'grep'
#           pgrep "$(cat process.tmp)"
            rm "$PIDFile"
            rm process.tmp
            exit 0
        fi
    fi

我编辑了剧本。感谢您的评论,它现在可以运行并执行以下操作:

  1. 让脚本接受部分名称作为输入
  2. 杀死超过1个PID
  3. 谢谢!

2 个答案:

答案 0 :(得分:0)

 It will not accept *firefox*

使用killall命令。示例:

killall -r "process.*"

这将终止名称中包含 process 的所有进程,然后是任何内容

[ manual ]说:

  

-r, --regexp
   将进程名称模式解释为扩展正则表达式。

<强>旁注:

请注意,我们必须对正则表达式进行双引号以防止文件通配。
(感谢@broslow提醒这些内容。)

答案 1 :(得分:0)

pkill存在以解决您的问题。它接受与进程名称匹配的模式,或者如果指定了-f,则接受整个命令行。