【问题标题】:How to kill a process which is running form a directory in CentOS?如何杀死从 CentOS 目录运行的进程?
【发布时间】:2023-03-11 22:10:01
【问题描述】:

我们有一个要求,即我们拥有从不同文件夹运行的同一个 Spark 应用程序(基本上是一个 .jar 文件)的副本。我正在寻找一个 shell 命令,使用它我可以终止在一个文件夹中运行的 Spark 应用程序,而不会终止其他 spark 作业。

例如:

/home/user/Folder1 - CapStoneSpark.jar
/home/user/Folder2 - CapStoneSpark.jar
/home/user/Folder3 - CapStoneSpark.jar

jar 文件中的主类是“CapStoneSparkMain”。假设我只想杀死运行在Folder2中的CapStoneSpark.jar,而不接触或杀死运行在Folder1和Folder3中的CapStoneSpark.jar,那我该怎么办?

我已经试过了:

kill $(ps aux | grep 'CapStoneSparkMain' | awk '{print $2}')

但是,它会杀死所有包含“CapStoneSparkMain”类的进程。

我只想杀死来自单个目录的进程,不想接触从其他目录运行的进程的副本。

【问题讨论】:

  • lsof 命令可以帮助您识别要杀死的正确 pid
  • 我是 shell 脚本的新手。你能指导我如何做到这一点吗?

标签: java linux shell apache-spark centos


【解决方案1】:

您可以找到所有使用这些文件夹的进程 ID:

lsof | grep /home/user/Folder | awk '{print "kill " $2}'

并执行它:

lsof | grep /home/user/Folder | awk '{print "kill " $2}'|sh

【讨论】:

  • 我认为 OP 只想杀死 CapStone 进程。
【解决方案2】:

不清楚这些作业是如何启动的,但假设每个作业都使用不同的工作目录启动,则可能会终止特定作业。鉴于可以通过 /proc/$$/cwd (指向作业文件夹的符号链接)找到每个进程的工作目录。基于上面建议的命令/循环:

kill_folder=/home/user/Folder2
for pp in $(ps aux | grep 'CapStoneSparkMain' | awk '{print $2}') ; do
    if [[ /proc/$$/cwd -ef "$kill_folder" ]]  && kill $$
done

代码将检查符号链接 /proc/$$/cwd 是否与命名文件夹 (kill_folder) 匹配,并且只会向该文件夹中的进程发出 kill。

【讨论】:

    【解决方案3】:

    你好

    一个用于检查用户在...中的 for 循环

    for i in $(pidof application); do grep -o ${user} /proc/${i}/cmdline; done
    

    if 它符合你的愿望thenkill 命令放在${i} 上循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多