代码之家  ›  专栏  ›  技术社区  ›  P.R.

如何找到处理bash管道的进程

  •  0
  • P.R.  · 技术社区  · 6 年前

    ((cd /tmp/test && while true; do ls -t | sed -e '1,100d' | xargs -I{} -d '\n' rm -R {}; sleep 1; done)&)

    ps ?

    目标是在一个更大的脚本中,我想自动检测这个进程是否已经在运行,如果没有,我想启动它。

    [编辑/澄清]保存PID不是解决方案,因为脚本可以多次执行。它应该确保机器为下面的过程做好准备。其目的是用户/开发人员只需运行它就可以确保一切都已设置好。如果部分条件已经满足,它们将被跳过。大多数需要运行的是幂等命令。这是我唯一努力使之成为幂等的命令。这是一个中间的黑客攻击,直到我们有一个适当的供应系统到位。

    2 回复  |  直到 6 年前
        1
  •  1
  •   keithpjolley    6 年前

    一种方法是在脚本中执行以下操作:

    lock="/tmp/${name}.lock"
    if [ -f "${lock}" ];then
      echo "already running. pid: $(cat "${lock}")"
      exit 1
    fi
    trap rm "${lock}" 2>/dev/null;exit" 0 1 2 15
    echo $$ > "${lock}"
    

    与其删除N个最旧的文件,我建议删除超过某个年龄段的文件,例如N天,如下所示:

    N=5 # delete everything older than N days
    find /tmp/test -ctime +"${N}"d -depth 1 -exec rm -r {} +
    

    这有很多好处,比如可以处理名称中带有空格或其他奇怪字符的文件。它也更容易预测,因为如果您的进程在/tmp/test中创建了10000个文件,那么删除100个文件会给您留下一个烂摊子,或者,相反,可能会删除您真正想要保留的新文件。另请注意,如果旧目录中有新文件,则新文件将被清除。 -depth 1 防止/tmp/test本身被删除。

    如果你真的想删除最老的N个文件,我会在一个脚本中这样做,并称之为 thecleaner.py & 和搜索 ps 为了这个。

    #! /usr/bin/env python
    # -*- coding: UTF8 -*-
    
    import os
    import shutil
    import time
    
    secs = 5            # number of seconds to pause during each loop
    N    = 100          # delete this many of the oldest files
    top  = "/tmp/test"  # remove N oldest files in this directory
    
    while True:
      paths  = sorted(os.listdir(top), key=os.path.getctime)
      oldest = paths[:N]
    
      for path in oldest:
        print("removing: {}".format(path))
        if os.path.isfile(path):
          os.remove(path)
        else:
          shutil.rmtree(path)                # delete entire directory tree
      time.sleep(secs)
    

    否则我不知道有什么方法可以可靠地找到你给出的循环。

        2
  •  1
  •   kabanus    6 年前

    ps aux 应该显示大多数进程和实际运行它们的行,这样您就可以grep您所需要的。 lsof 可能会显示更多,可能太多了。

    如果你需要创建一个易于grep的东西,把它放到一个文件中,比如 ~/my.cmd

    bash --init-file my.cmd
    

    或者让它运行起来 my.cmd .

    你甚至可以用 setsid 使用这些可以从终端分离,所以它总是在后台运行。那就

    ps aux | grep "my.cmd"
    

    | wc -l 然后检查它是否返回2。

    我建议你退房 crontab 不过,它似乎更适合你想要的东西。