我在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不是解决方案,因为脚本可以多次执行。应该确保机器已准备好进行后续过程。目的是使用户/开发人员可以运行它以确保一切都已设置。如果部分条件已经满足,则将跳过这些条件。大多数需要运行的是幂等命令。这是我努力使幂等的唯一命令。在我们拥有适当的预配系统之前,这是一个中间技巧。
答案 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)
否则,我不知道有什么方法可以可靠地找到您给出的循环。