现在,我的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 个以上的 PID
谢谢!
pkill 的存在是为了解决你的问题。它接受与进程名称匹配的模式,或整个命令行(如果指定了-f
)。
It will not accept *firefox*
使用终止命令。例:
killall -r "process.*"
这将杀死所有名称在开头包含进程的进程,然后是任何内容。
[手册]说:
-r, --regexp
将进程名称模式解释为扩展正则表达式。
旁注:
请注意,我们必须对正则表达式进行双引号以防止文件通配。
(谢谢@broslow提醒这些东西)。