Linux 如何找到处理bash管道的进程
我在bash中运行while循环,定期删除目录中的所有“旧”文件(只保留100个最新文件)。此过程在后台运行:Linux 如何找到处理bash管道的进程,linux,bash,unix,Linux,Bash,Unix,我在bash中运行while循环,定期删除目录中的所有“旧”文件(只保留100个最新文件)。此过程在后台运行: ((cd/tmp/test&&while true;do ls-t|sed-e'1100d'| xargs-I{}-d'\n'rm-R{};sleep 1;done)& 如何在ps中找到此bash进程的进程 目标是,在一个更大的脚本中,我想自动检测这个进程是否已经运行,如果没有,我想启动它 [编辑/澄清]保存PID不是解决方案,因为脚本可以执行多次。应确保机器为以下过程做好准备。其目的
((cd/tmp/test&&while true;do ls-t|sed-e'1100d'| xargs-I{}-d'\n'rm-R{};sleep 1;done)&
如何在ps
中找到此bash进程的进程
目标是,在一个更大的脚本中,我想自动检测这个进程是否已经运行,如果没有,我想启动它
[编辑/澄清]保存PID不是解决方案,因为脚本可以执行多次。应确保机器为以下过程做好准备。其目的是用户/开发人员可以运行它,以确保一切都已设置好。如果部分条件已满足,则将跳过这些条件。大多数需要运行的是幂等命令。这是我正在努力使幂等的唯一命令。在我们有一个适当的供应系统之前,这是一个中间的黑客行为
ps aux
应该显示大多数进程以及实际运行它们的行,这样您就可以根据需要进行greplsof
可能会显示更多,可能太多
如果需要创建易于grep的内容,请将其放入文件中,比如说~/my.cmd
,然后运行
bash --init-file my.cmd
或者让它可以运行并运行my.cmd
您甚至可以使用setsid
将其与终端分离,使其始终在后台运行。那就
ps aux | grep "my.cmd"
如果有两个点击(两个点击-一个是grep,另一个是run),应该识别它。您可以使用|wc-l
并检查它是否返回2
不过我建议你去看看,它似乎更适合你想要的东西。
ps aux
应该显示大多数进程以及实际运行它们的行,这样你就可以grep你需要的了lsof
可能会显示更多,可能太多
如果需要创建易于grep的内容,请将其放入文件中,比如说~/my.cmd
,然后运行
bash --init-file my.cmd
或者让它可以运行并运行my.cmd
您甚至可以使用setsid
将其与终端分离,使其始终在后台运行。那就
ps aux | grep "my.cmd"
如果有两个点击(两个点击-一个是grep,另一个是run),应该识别它。您可以使用|wc-l
并检查它是否返回2
不过我建议你去看看,它似乎更适合你想要的东西。一种方法是在你的脚本中执行以下操作:
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个文件会给您带来混乱,或者,从另一个角度看,可能会删除您真正想要保留的新文件。还请注意,如果旧目录中有新文件,则新文件将被删除<代码>-深度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)
否则,我无法可靠地找到您给出的循环。一种方法是在脚本中执行以下操作:
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个文件会给您带来混乱,或者,从另一个角度看,可能会删除您真正想要保留的新文件。还请注意,如果旧目录中有新文件,则新文件将被删除<代码>-深度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)
否则,我无法可靠地找到您给出的循环。这不是XY问题。只需保存进程的后台pid<代码>(您的命令)&;_my_命令的pid_=$?;pgrep$?。如果只想运行脚本的一个实例,请使用flock。改用
crontab
?这不是问题所在。只需保存进程的后台pid<代码>(您的命令)&;_my_命令的pid_=$?;pgrep$?。如果只想运行脚本的一个实例,请使用flock。改为使用crontab
?这确实不起作用。因为我不知道该为什么祈祷。对于测试,我在前台的OP中运行管道(没有(
)&
),并尝试grep进行测试,,而和睡眠仅睡眠显示某些内容,而不是整个管道。相反,它只显示彼得17128 0.0 0.0 7288 668分/23秒+13:58 0:00睡眠1
。那么我如何知道它是否是正确的sleep
,而不是另一个呢?@P.R最简单的方法是把它放在一个文件中,然后运行一个bash调用来获取它。这真的不起作用。因为我不知道该为什么祈祷。对于测试,我在前台的OP中运行管道(没有(
)&
),并尝试grep进行测试,,而和睡眠仅睡眠显示某些内容,而不是整个管道。相反,它只显示彼得17128 0.0 0.0 7288 668分/23秒+13:58 0:00睡眠1
。那么,我如何知道它是否是正确的睡眠
,而不是另一个呢?@P.R最简单的方法——把它放在我的面前