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

时间:2018-08-10 12:47:07

标签: linux bash unix

我在bash中运行while循环,以定期删除目录中的所有“旧”文件(仅保留100个最新文件)。此过程在后台运行:

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

如何在ps中找到此bash进程的进程?

目标是我希望自动检测较大脚本的一部分,如果该进程已经在运行,则我想启动它。

[编辑/说明]保存PID不是解决方案,因为脚本可以多次执行。应该确保机器已准备好进行后续过程。目的是使用户/开发人员可以运行它以确保一切都已设置。如果部分条件已经满足,则将跳过这些条件。大多数需要运行的是幂等命令。这是我努力使幂等的唯一命令。在我们拥有适当的预配系统之前,这是一个中间技巧。

2 个答案:

答案 0 :(得分:1)

ps aux应该显示最多的进程以及实际运行它们的行,因此您可以grep所需的内容。 lsof可能会显示更多甚至更多。

如果您需要创建易于grep的内容,请将其放入文件中,说~/my.cmd,然后运行

bash --init-file my.cmd

或使其可运行并运行my.cmd

您甚至可以使用setsid与终端分离,因此它始终在后台运行。然后就

ps aux | grep "my.cmd"

如果有两个匹配项(两个匹配项-一个用于grep,另一个匹配),则应识别它。您可以使用| wc -l并检查它是否返回2。

尽管如此,我还是建议您查看crontab,它似乎更适合您想要的所有内容。

答案 1 :(得分:1)

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

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)

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