【问题标题】:Killing a while loop that's running in the background without a PID在没有 PID 的情况下杀死在后台运行的 while 循环
【发布时间】:2018-01-08 11:06:57
【问题描述】:

我是 Linux 各个方面的初学者,所以请慢慢来。

我创建了一个在后台运行的“脚本”:

while true; do echo "I'm alive" >> alive.log ; done &

脚本的输出保存在用户主目录中的 alive.log 文件中。 问题是我不知道如何杀死循环,因为它正在填满我的磁盘空间,如果我想删除文件,那么循环将创建一个新文件并用我问过的文本“我还活着”填充它它要做。

我尝试使用:

ps - aux | grep while

ps - aux | grep alive 

这两行的输出将为我提供我需要的 PID,但问题是脚本是一个循环,这意味着 PID 每次运行时都会改变(递归)所以我不能使用 PID 来杀死过程。

我也尝试过使用:

pkill while
killall while

两行的结果都是0(使用pkill while -c "0" 或killall while : "while: no process found" 时可以看到输出;

有什么建议吗?

【问题讨论】:

  • 键入fg 将其置于前台并使用 ctrl-c 将其杀死。
  • ... 或kill %1。检查help kill
  • 输入jobs,找到你的脚本(例如[1]+ Running ...),然后用kill %1(或[ ]中的任何数字)杀死它。
  • killall script name,而不是killall while
  • 如果我输入作业,我将有 0 个输出,不会显示任何行,因此我无法从那里获取任何信息。但是脚本仍在运行,因为我不断检查文件 alive.log 以查看它的大小以及何时删除它,以便我仍然有空间。

标签: linux bash loops pid kill


【解决方案1】:

这是@James Brown 在 cmets 中的回答。

键入fg 将其置于前台并使用ctrl-c 以最快的方式解决此问题。

【讨论】:

    【解决方案2】:

    如果你运行该脚本,如果你命令ps -ef,它将显示为bash

    UID        PID  PPID  C STIME TTY          TIME CMD
    james    27262  2448 98 17:35 pts/3    00:00:12 bash
    james     2448  2446  0 Jul19 pts/3    00:04:49 bash
    

    (如果您使用的是bash),其父pid 也指向bash 进程(PID 27262 是您上面的紧密小循环)。因此,找到所有具有bash 进程作为父进程的bash 进程。这可能有效:

    $ awk '/^james/ && $NF=="bash" && NR==FNR{a[$2];next} /^james/ && $NF=="bash" && $3 in a{print $2}' <(ps -ef) <(ps -ef)
    27262
    27359
    

    所以,那些是杀戮的好人选。在这种情况下,另一个是ps -ef,另一个是标记。

    【讨论】:

      【解决方案3】:

      我决定在后台试用您的“脚本”。当我跑步时

      while true; do echo "I'm alive" >> alive.log ; done &
      

      它将进程 ID 返回到标准输出,从而表明该进程正在后台运行。您可以使用以下命令终止此进程 ID:

      kill <pid>
      

      【讨论】:

      • 谢谢!如果您愿意为我的帖子投票,那将不胜感激。我还要感谢 Ulysse BN 使代码更具可读性。
      【解决方案4】:

      我将这句话写在一个名为while.sh的脚本文件中,并通过shell运行:

      [edemon@CentOS workspace]$ ./while.sh 
      [edemon@CentOS workspace]$ 
      

      没有PID。 我使用 top 命令工具搜索了我的 while.sh,它告诉我:

        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                 
       4036 edemon    20   0  5268  756  436 R 97.3  0.0   0:07.93 bash                                                                    
       2469 root      20   0 94412  29m  10m S  7.8  2.0   1:49.19 Xorg                                                                    
       2788 edemon    20   0 74300  12m  10m S  1.9  0.9   1:38.79 nm-applet                                                               
       4040 edemon    20   0  2708 1072  796 R  1.9  0.1   0:00.01 top 
      

      while的父进程是bash,所以我杀了4036。alive.log的大小不再增长了。

      【讨论】:

        【解决方案5】:

        尝试重新启动两次,第一次不起作用,但第二次之后循环不再存在并且文件不会被重写。

        另外,在我摆脱它之后,我重新输入了脚本:

        while true; do echo "I'm alive" >> alive.log ; done &
        

        正如@ssharma 在输入脚本时所说,输出是一个 PID,即使循环不断更改 PID,我也能够使用该 PID 终止循环。

        感谢您的帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-11
          • 1970-01-01
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多