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



我在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 不是解决方案,因为脚本可以多次执行。它应该确保机器为后续过程做好准备。目的是用户/开发人员可以运行它以确保一切都已设置。如果部分条件已经满足,它们将被跳过。需要运行的大多数内容都是幂等命令。这是我正在努力使幂等的唯一命令。在我们有一个适当的配置系统之前,这是一个中间黑客。

一种方法是在脚本中执行类似操作的操作:

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)

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

>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,它似乎更适合您想要的。

最新更新