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

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不是解决方案,因为脚本可以执行多次。应确保机器为以下过程做好准备。其目的

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

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


不过我建议你去看看,它似乎更适合你想要的东西。

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最简单的方法——把它放在我的面前