有没有办法判断进程是否打开了带有 O_SYNC 标志的文件?我想 lsof 可以做到这一点,但找不到方法。
答案1
这可以使用脚本来完成systemtap
。此脚本取自这里,并且完全按照你的要求做:
# list_flags.stp
# Copyright (C) 2007 Red Hat, Inc., Eugene Teo
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
%{
#include <linux/file.h>
%}
function list_flags:long (pid:long, fd:long) %{
struct task_struct *p;
struct list_head *_p, *_n;
list_for_each_safe(_p, _n, ¤t->tasks) {
p = list_entry(_p, struct task_struct, tasks);
if (p->pid == (int)THIS->pid) {
struct file *filp;
struct files_struct *files = p->files;
spin_lock(&files->file_lock);
filp = fcheck_files(files, (int)THIS->fd);
THIS->__retvalue = (!filp ? -1 : filp->f_flags);
spin_unlock(&files->file_lock);
break;
}
}
%}
probe begin {
flag_str = ( (flags = list_flags($1, $2)) ? _sys_open_flag_str(flags) : "???");
printf("pid: %d, fd: %d: %s\n", $1, $2, flag_str)
exit()
}
引用的链接中提供了有关如何使用它的两个示例,我将在这里重现其中一个:
[eteo@kerndev ~]$ stap -vg list_flags.stp $$ 3 2>&1 | grep O_DIRECT
pid: 30830, fd: 3: O_RDONLY|O_APPEND|O_CREAT|O_DIRECT|O_DIRECTORY|O_EXCL|O_LARGEFILE|O_NOATIME|O_NOCTTY|O_NOFOLLOW|O_NONBLOCK|O_SYNC|O_TRUNC
您可以O_DIRECT
根据O_SYNC
自己的目的进行替换。
更多参考:
############
答案2
lsof +fg /path
将显示用于打开以路径形式提供的文件的标志。返回的标志的简短描述可以在 man lsof 中找到。