【问题标题】:Issue finding the process id from shell scipt从 shell 脚本中查找进程 ID 的问题
【发布时间】:2015-12-05 20:11:32
【问题描述】:

mySample.sh

pid=$(ps -Af | grep $1 | grep -v grep | awk ' { print $2 } ');  
echo $pid

上面的命令正在打印并杀死为 grep 创建的临时进程 即使我没有使用 Abcd 运行任何进程, 这是打印 pid 任何忽略它的方法, 我实际上使用grep -v 忽略它,仍然...

./mySample.sh Abcd
 6251 6378 6379

获取进程ID有什么问题吗?

基本命令行输出如下,运行名为 Acc_Application_One 的进程后

[root@localhost 桌面]# ps -Af | grep 加号

root 6251 2758 0 16:16 pts/1 00:00:00 ./Acc_Application_One

root 7288 2758 0 16:57 pts/1 00:00:00 grep Acc

更改了 mySample.sh

    pgrep -fl "$1" 

输出是

[root@localhost 桌面]# mySample.sh Acc_Application_One

6251 7289

【问题讨论】:

  • 你还需要用grep -v忽略mySample进程。
  • 大多数pss 都有tree 选项。在你的脚本之外做一些调试,看看你的./mySample.sh 的进程tree 是什么样子的。如果你幸运的话,你的系统我有pstree $PID 可用。祝你好运。

标签: linux bash shell


【解决方案1】:

要在命令行中的任何位置使用该模式终止进程,请使用pkill -f

pkill -f "$1"

根据man pkill

-f 匹配进程的完整参数字符串中的模式 anywhere 而不仅仅是可执行文件名称。

同样可以使用pgrep -f "$1"列出匹配进程的进程id。

【讨论】:

  • 他并没有试图杀死他脚本中的进程。而且他只想匹配命令名,而不是在行中的任何地方匹配。
  • 我仍然建议使用pgrep -f 而不是管道psgrepawk
  • 如果我删除 -f 标志,它不会显示任何内容,尽管我的进程正在运行
  • @anubhava : pgrep -f 正在工作,但相同,即使是打印一个额外的进程 id。
  • 好的,pgrep -fl "$1" 向您展示了什么?可能还有其他匹配过程
【解决方案2】:

尝试一些更简单的方法:

pid=$(pgrep "$1")

如果你想杀死它:

pkill "$1"

【讨论】:

  • 他们都没有工作,事实上,他们没有获取进程ID。不知何故,我发布的原始命令是获取 exta pid 的。 ps:我使用的是 Redhat 6.2(它很旧)
  • 您可能需要pgrep -f,如另一个答案所示。
【解决方案3】:

删除 awk 后问题会变得清晰:mySample.sh 也会有 Abcd。

ps -Af | grep " $1" | grep -Ev "grep|$0" | awk ' { print $2 } '

【讨论】:

  • ./mySamele.sh Acc_Application_One 6251 7303 7304 7306 这给出了 4 个 proc id,即使我有一个进程正在运行
【解决方案4】:

使用以下代码更改了 mySample.sh 脚本 这只是使用发送的参数获取 processId 并杀死它

pid=$(pgrep -fl $1 | grep -v '[k]ill_script'| awk ' { print $1 } ')
echo $pid
if [[ -n ${pid} ]]; then
echo "Stopping Acc Application $1  with pid=${pid}"
kill -9 ${pid}
fi

谢谢

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 2015-10-12
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多