8个Linux进程管理命令详解及示例(三):pgrep和flock命令

1.pgrep 命令

想要查找流程及其详细信息?pgrep 命令可以帮助我们解决这个问题。

与用于从文件和输出中查找字符串的 grep 命令一样,pgrep 命令对进程执行相同的操作。

简单来说,pgrep 命令将为我们提供正在运行中的进程 PID

下面介绍如何使用 pgrep 命令的各种示例。

要使用 pgrep 命令,必须遵循给定的命令语法:

pgrep [options] pattern

在这里,pattern 将指定输出的参数。

下面列举一些具体的实例:

1.1使用 pgrep 命令查找特定进程的 PID

要找到特定进程的 PID,只需遵循给定的语法即可:

pgrep -u username process_name

假设想为用户 sagar 查找 ssh 的进程 ID,使用以下命令:

pgrep -u sagar ssh
1.2获取用户拥有的进程数

如果想了解特定用户正在使用的进程数量,可以在pgrep命令后加上-c-u选项,并附上用户名,如下所示:

pgrep -c -u username

例如,要查找名为 sagar 的用户拥有的进程数:

pgrep -c -u sagar

也可以合并多个用户的进程数,可以按列分隔它们:

pgrep -c -u user-1,user-2

比如,要查询root 和sagar两个用户的进程:

1.3以不区分大小写的方式搜索进程

默认情况下,pgrep工具是区分大小写的,因此可能无法找到所需的进程,但可以通过使用 -i 选项切换到不区分大小写的模式:

pgrep -i process_name

例如,要查找 firefox 但使用了所有大写字母,它返回了正确的结果:

pgrep -i FIREFOX
1.4列出正在进行的进程及其名称和 PID

如果你想列出每个正在进行的进程及其名称和 PID,可以使用 -l 选项:

pgrep -u username -l

例如,下面列出了与名为 sagar 的用户相关的每个正在进行的进程:

pgrep -u sagar -l
1.5查找用于启动当前进程的命令

pgrep工具还允许用户通过使用 -a 选项查看用于启动当前进程的命令:

pgrep -u username -a

假设正在查找以root用户身份执行的当前进程的命令,那么可以这样操作:

pgrep -u root -a
1.6查找最近启动的进程

如果想查找最近启动的进程,可以使用-n选项轻松找到:

pgrep -n 

也可以将-n-l搭配使用,这样可以获取更有用的输出,因为它还会显示进程名称:

pgrep -n -u sagar -l
1.7查找 Linux 上运行时间最长的进程

如果想查找系统中运行时间最长的进程,pgrep工具可以在使用-o选项时实现这一功能:

pgrep -o

例如,想查找用户(sagar)运行时间最长的进程,可以使用以下命令:

pgrep -u sagar -o -l
2.flock 命令

Linux 中的 flock 命令可以从脚本或命令行管理文件锁,确保一次只有一个进程可以访问文件,从而防止因多个进程同时访问同一文件而导致的数据损坏。

简单来说,flock(文件锁)会锁定文件,使得只有一个进程可以访问该文件,并限制其他进程使用该文件,以防止数据损坏。这种情况通常发生在多个进程尝试使用同一文件时。

下面通过多个示例展示如何使用 flock 命令。

使用 flock 命令时需要遵循的基本语法:

flock [options] file [command]
  • [options]:用于修改 flock 命令的默认行为。

  • file:指定 flock 命令的目标文件。

  • [command]:一个可选参数,用于指定在 flock 获取锁后需要执行的命令。

2.1等待锁被释放(默认行为)

想锁定文件并对其执行命令,但如果锁已经被另一个进程获取了怎么办?等待锁被释放是一个方法。

要实现这一点,不需要任何额外的选项,因为这是 flock 的默认行为,它会等待直到锁被释放。

以下是实现方法:

flock /path/to/file --command "the_actual_command"

为演示这一点,下面并排对同一个文件使用了 flock 命令,因此第一次执行将首先获取锁,同时第二次执行将等待锁被释放。

在一侧使用 sleep 命令,在另一侧使用 echo 命令:

如上图,首先在左侧窗口中执行了 sleep 命令,这意味着锁被占用了 3 秒,与此同时,右侧窗口的命令也被执行了。

因此,echo 命令(在右侧窗口执行)需要等待 3 秒才能执行。

2.2如果文件被锁定,则停止

虽然等待文件锁被释放是一个不错的选择,但有时我们希望快速完成任务。如果文件被锁定,你可能更倾向于改变策略,而不是等待锁被释放。

为此,需要使用以下 -n选项:

flock -n /path/to/file --command "the_actual_command"

以下是目标文件被锁定时的行为方式:

在上面的示例中,左侧窗口的命令锁定了文件 3 秒,而右侧窗口尝试在文件被锁定时访问同一文件。

结果,它没有返回任何内容,并且不会等待文件锁被释放。

2.3使用共享锁

也称为读锁,它允许多个进程同时访问共享资源而不会相互干扰。

当希望允许多个进程读取特定文件但限制写入访问时,这非常有用。

要使用共享锁,可以使用 -s 选项,如下所示:

flock -s /path/to/file <command_to_execute>

作为参考,将在同一时刻使用两次 -s 选项,由于这两个命令都只是尝试读取文件内容,因此它们都会被执行:

2.4解锁文件

虽然锁会自动释放,但有时可能希望手动释放锁以完成任务,为此,你需要使用 -u 选项,如下所示:

flock -u /path/to/file --command "actual_command"

为了演示这一点,对一个文件使用 flock 命令锁定它,然后在另一侧使用 -u 选项来展示如何解锁:

如果没有使用 -u 选项,它将不允许使用该文件。

以下是一个实际示例:

相关推荐
qq_459238491 分钟前
java八股文之框架
java·开发语言·数据库
千里码!3 分钟前
java23种设计模式-解释器模式
java·设计模式·解释器模式
web137656076434 分钟前
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
java·spring boot·后端
代码中の快捷键7 分钟前
Spring MVC 的执行流程解析:从用户请求到响应返回
java·spring·mvc
猿周LV21 分钟前
递归遍历目录 和 普通文件的复制 [Java EE]
java·java-ee
要好好养胃22 分钟前
2-1文件描述符
linux·服务器
先睡22 分钟前
Field 对象的使用
java·开发语言·算法
Easonmax29 分钟前
【javaEE】计算机是如何工作的(基础常识)
java·java-ee
振宇i33 分钟前
golang安装(1.23.6)
linux·运维·服务器