Linux問題排查-找到偷偷寫文件的進程

在 Linux 系統中,若要通過已修改的文件找到修改該文件的進程 PID,可以結合以下方法分析,具體取決于文件是否仍被進程打開或已被刪除但句柄仍存在:

一、文件仍被進程打開(未刪除)

如果文件當前正在被某個進程修改且未關閉/刪除,可通過以下方式查找:

1. lsof 命令(推薦)

lsof(List Open Files)可列出系統中所有打開的文件及對應的進程信息。
命令格式

lsof <文件路徑>

示例

lsof /var/log/syslog

輸出解讀

  • PID 列:修改文件的進程 PID。
  • USER 列:進程所屬用戶。
  • FD 列:文件描述符(u 表示讀寫模式,r 表示只讀,w 表示寫入)。
2. fuser 命令

fuser 用于查找使用指定文件的進程。
命令格式

fuser -v <文件路徑>

示例

fuser -v /tmp/test.txt

輸出解讀

  • USER 列:進程所屬用戶。
  • PID 列:占用文件的進程 PID。
  • TYPE 列:文件類型(如 cwd 表示當前工作目錄,txt 表示可執行文件,mem 表示內存映射)。

二、文件已被刪除但進程仍持有句柄

若文件已被刪除(如通過 rm 命令刪除),但進程仍在寫入該文件(未關閉文件句柄),此時文件在磁盤上已不可見,但可通過進程的虛擬文件系統(/proc)查看:

1. 通過 /proc/<PID>/fd 查找

每個進程的文件描述符存儲在 /proc/<PID>/fd/ 目錄下,即使文件已刪除,仍可能存在指向該文件的句柄(顯示為 (deleted))。
步驟

  1. 遍歷所有進程的 fd 目錄:

    for pid in /proc/[0-9]*; dols -l $pid/fd 2>/dev/null | grep "deleted" | grep "<文件名片段>"
    done
    

    (將 <文件名片段> 替換為已刪除文件的部分名稱,如 test.txt

  2. 示例輸出

    lrwx------ 1 root root 64 Jun  5 14:30 3 -> /tmp/test.txt (deleted)
    
    • 上述輸出表示 PID 對應目錄下的文件描述符 3 指向已刪除的 /tmp/test.txt,該進程正在寫入該文件。
2. lsof 命令直接查詢(支持已刪除文件)

lsof 可直接列出已刪除但仍被進程打開的文件:

lsof | grep "deleted" | grep "<文件名片段>"

示例輸出

vim     12345  user    3r   REG  8,1  1234  56789 /tmp/test.txt (deleted)
  • PID=12345 的進程(此處為 vim)正在以只讀模式(3r)打開已刪除的文件。

三、通過文件修改時間和進程日志輔助定位

若無法通過上述方法直接定位(如文件已關閉且未被刪除),可結合以下間接方式:

1. 查看文件修改時間

通過 stat 命令獲取文件最后修改時間:

stat /path/to/file
  • 記錄時間戳后,結合系統日志(如 syslogauditd)或進程監控工具(如 ps aux --sort=-etime)查找該時間段內活躍的進程。
2. 使用 auditd 審計系統

若系統啟用了 auditd(審計服務),可配置規則監控文件修改事件:

  1. 添加審計規則:

    auditctl -w /path/to/file -p wa -k file_modify
    

    (監控文件的寫入(w)和屬性修改(a)事件)

  2. 觸發修改后,查看審計日志:

    ausearch -k file_modify | grep pid
    
    • 輸出中會包含修改文件的進程 PID 和用戶信息。

四、總結:常用命令速查表

場景命令示例說明
文件未刪除,查找進程lsof /path/to/file直接列出打開文件的進程
文件未刪除,快速定位fuser -v /path/to/file顯示占用文件的進程及權限
文件已刪除,查找句柄`lsofgrep “deleted”
遍歷進程 fd 目錄for pid in /proc/[0-9]*; do ls -l $pid/fd; done手動篩查文件描述符

注意事項

  • 權限問題:部分文件(如系統文件)需 root 權限才能查看。
  • 時效性:若進程已關閉文件或重啟,將無法通過上述方法定位。 這個問題下面的案例可以實現
  • 日志依賴auditd 等功能需提前配置,否則無法追溯歷史修改事件。

根據文件是否被刪除及當前狀態,選擇合適的工具組合即可高效定位修改文件的進程 PID。

案例:

現在/tmp目錄被寫入了一個/tmp/20250514080520642/68244ec00b4743533ed841b6 的文件,如何編寫一個shell的監控程序,可以在下一次進程些文件的時候,可以獲取進程信息。

在傳統的 comm 命令中,-z 選項并非標準選項(可能僅在某些特定系統或版本中存在)。當出現 comm: 無效選項 -- z 錯誤時,說明當前系統的 comm 不支持帶 NUL 分隔符的 z 參數。此時需要調整腳本邏輯,改用其他方式處理包含特殊字符(如換行符)的文件路徑。以下是修改后的腳本,移除 comm -z 并改用文本行處理:

修正后的輪詢監控腳本(兼容傳統 comm)

#!/bin/bash# 純 shell 實現的 /tmp 目錄監控腳本(修復 comm -z 錯誤)
# 使用方法: ./monitor_tmp_polling.sh [輪詢間隔(秒)] [輸出日志文件]POLL_INTERVAL="${1:-1}"  # 默認輪詢間隔 1 秒
LOG_FILE="${2:-/tmp/tmp_writes_monitor.log}"
TMP_DIR="/tmp"# 創建日志文件
touch "$LOG_FILE" || { echo "無法創建日志文件 $LOG_FILE" >&2; exit 1; }echo "=== 開始監控 $TMP_DIR 目錄的寫入操作 (輪詢間隔: ${POLL_INTERVAL}s) ===" | tee -a "$LOG_FILE"
echo "日志文件: $LOG_FILE"
echo "按 Ctrl+C 停止監控"
echo# 初始文件列表(每行一個文件路徑)
OLD_FILES=$(mktemp)
find "$TMP_DIR" -type f -print 2>/dev/null | sort > "$OLD_FILES"# 清理函數
cleanup() {rm -f "$OLD_FILES" "$NEW_FILES"echo "=== 監控已停止 ===" | tee -a "$LOG_FILE"exit
}trap cleanup SIGINT SIGTERMwhile true; do# 新文件列表(每行一個文件路徑)NEW_FILES=$(mktemp)find "$TMP_DIR" -type f -print 2>/dev/null | sort > "$NEW_FILES"# 找出新增的文件(通過 comm 對比,排除已存在的文件)NEW_FILES_LIST=$(comm -13 "$OLD_FILES" "$NEW_FILES")  # 移除 -z 選項if [ -n "$NEW_FILES_LIST" ]; thentimestamp=$(date +"%Y-%m-%d %H:%M:%S")echo "[$timestamp] 檢測到 $(echo "$NEW_FILES_LIST" | wc -l) 個新文件" | tee -a "$LOG_FILE"# 處理每個新增文件(逐行讀取,兼容含空格的文件名)while IFS= read -r file; doecho "[$timestamp] 新文件: $file" | tee -a "$LOG_FILE"# 嘗試查找打開該文件的進程lsof_output=$(lsof "$file" 2>/dev/null)if [ -n "$lsof_output" ]; then# 提取進程信息(跳過表頭)pids=$(echo "$lsof_output" | awk 'NR>1 {print $2}')echo "[$timestamp] 發現 $(echo "$pids" | wc -w) 個進程正在訪問該文件:" | tee -a "$LOG_FILE"echo "$lsof_output" | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"# 為每個進程獲取詳細信息for pid in $pids; doecho "[$timestamp] 進程 $pid 的詳細信息:" | tee -a "$LOG_FILE"ps -p "$pid" -o user,pid,ppid,cmd,%cpu,%mem,start,etime | tee -a "$LOG_FILE"# 獲取進程打開的所有文件描述符echo "[$timestamp] 進程 $pid 打開的文件描述符:" | tee -a "$LOG_FILE"ls -l /proc/"$pid"/fd 2>/dev/null | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"doneelseecho "[$timestamp] 未找到訪問該文件的進程 (可能已關閉文件句柄)" | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"fidone <<< "$NEW_FILES_LIST"fi# 更新文件列表mv "$NEW_FILES" "$OLD_FILES"# 等待下一個輪詢周期sleep "$POLL_INTERVAL"
done
使用說明

與之前的腳本相同,直接運行即可:

chmod +x monitor_tmp_polling.sh
./monitor_tmp_polling.sh  # 默認輪詢間隔 1 秒,日志存于 /tmp/tmp_writes_monitor.log

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81493.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

More Effective C++:改善編程與設計(下)

目錄 條款19:了解臨時對象的來源 條款20:協助完成“返回值優化” 條款21:利用重載技術避免隱式類型轉換 條款22:考慮以操作符復合形式&#xff08;op&#xff09;取代其獨身形式&#xff08;op&#xff09; 條款23:考慮使用其他程序庫 條款24:了解virtual functions、mul…

VTK|類似CloudCompare的比例尺實現2-vtk實現

文章目錄 實現類頭文件實現類源文件調用邏輯關鍵問題縮放限制問題投影模式項目git鏈接實現類頭文件 以下是對你提供的 ScaleBarController.h 頭文件添加詳細注釋后的版本,幫助你更清晰地理解每個成員和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…

PostgreSQL 聯合索引生效條件

最近面試的時候&#xff0c;總會遇到一個問題 在 PostgreSQL 中&#xff0c;聯合索引在什么條件下會生效&#xff1f; 特此記錄~ 前置信息 數據庫版本 PostgreSQL 14.13, compiled by Visual C build 1941, 64-bit 建表語句 CREATE TABLE people (id SERIAL PRIMARY KEY,c…

SpringBoot項目里面發起http請求的幾種方法

在Spring Boot項目中發起HTTP請求的方法 在Spring Boot項目中&#xff0c;有幾種常用的方式可以發起HTTP請求&#xff0c;以下是主要的幾種方法&#xff1a; 1. 使用RestTemplate (Spring 5之前的主流方式) // 需要先注入RestTemplate Autowired private RestTemplate restT…

《Python星球日記》 第90天:微調的概念以及如何微調大模型?

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、微調原理1. 什么是大模型微調?2. 為什么需要微調?3. 微調的基本流程4. 微調策略分類二、LoRA(Low-Rank Adaptation)技術詳解1. LoRA的核…

機器學習-人與機器生數據的區分模型測試 - 模型融合與檢驗

模型融合 # 先用普通Pipeline訓練 from sklearn.pipeline import Pipeline#from sklearn2pmml.pipeline import PMMLPipeline train_pipe Pipeline([(scaler, StandardScaler()),(ensemble, VotingClassifier(estimators[(rf, RandomForestClassifier(n_estimators200, max_de…

怎樣免費開發部署自己的網站?

要免費開發自己的網站&#xff0c;您可以根據自己的技術水平和需求選擇以下兩種主要方式&#xff1a; 零基礎用戶&#xff1a;建議使用如WordPress.com、Weebly、Strikingly等平臺&#xff0c;快速搭建網站。 有一定技術基礎的用戶&#xff1a;可選擇自行開發網站&#xff0c;…

調用百度云API機器翻譯

新建Python文件&#xff0c;叫 text_translator.py 輸入 import requests import jsonAPI_KEY "glYiYVF2dSc7EQ8n78VDRCpa" # 替換為自己的API Key SECRET_KEY "kUlhze8OQZ7xbVRp" # 替換為自己的Secret Keydef main():# 選擇翻譯方向while True:di…

OpenAI與微軟洽談新融資及IPO,Instagram因TikTok流失四成用戶

OpenAI與微軟洽談新融資及IPO 據悉&#xff0c;OpenAI 正與微軟洽談新融資及籌備 IPO&#xff0c;關鍵問題是微軟在 OpenAI 重組后的股權比例。微軟已投資超 130 億美元&#xff0c;雙方修訂 2019 年合同&#xff0c;微軟擬棄部分股權換新技術訪問權。OpenAI 上周放棄了有爭議轉…

git工具使用詳細教程-------命令行和TortoiseGit圖形化

下載 git下載地址&#xff1a;https://git-scm.com/downloads TortoiseGit&#xff08;圖形化工具&#xff09;下載地址&#xff1a;https://tortoisegit.org/download/ 認識git結構 工作區&#xff1a;存放代碼的地方 暫存區&#xff1a;臨時存儲&#xff0c;將工作區的代碼…

構建RAG混合開發---PythonAI+JavaEE+Vue.js前端的實踐

7GB顯存如何部署bf16精度的DeepSeek-R1 70B大模型&#xff1f;-CSDN博客 服務容錯治理框架resilience4j&sentinel基礎應用---微服務的限流/熔斷/降級解決方案-CSDN博客 conda管理python環境-CSDN博客 快速搭建對象存儲服務 - Minio&#xff0c;并解決臨時地址暴露ip、短…

【Java ee初階】jvm(3)

一、雙親委派機制&#xff08;類加載機制中&#xff0c;最經常考到的問題&#xff09; 類加載的第一個環節中&#xff0c;根據類的全限定類名&#xff08;包名類名&#xff09;找到對應的.class文件的過程。 JVM中進行類加載的操作&#xff0c;需要以來內部的模塊“類加載器”…

wps excel將表格輸出pdf時所有列在一張紙上

記錄&#xff1a;wps excel將表格輸出pdf時所有列在一張紙上 1&#xff0c;調整縮放比例&#xff0c;或選擇將所有列打印在一頁 2&#xff0c;將表格的所有鋪滿到這套虛線

分布式微服務系統架構第134集:筆記1運維服務器經驗,高并發,大數據量系統

加群聯系作者vx&#xff1a;xiaoda0423 倉庫地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ https://github.com/webVueBlog/fastapi_plus https://webvueblog.github.io/JavaPlusDoc/ ? 一、查看端口是否被占用的常用命令 1?? lsof 命令&…

IS-IS 中間系統到中間系統

前言&#xff1a; 中間系統到中間系統IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;屬于內部網關協議IGP&#xff08;Interior Gateway Protocol&#xff09;&#xff0c;用于自治系統內部 IS-IS也是一種鏈路狀態協議&#xff0c;使用最短路徑優先…

前端安全:XSS、CSRF 防御與最佳實踐

引言 隨著互聯網應用的普及&#xff0c;前端安全問題日益凸顯。作為開發者&#xff0c;了解并防范常見的安全威脅至關重要。本文將深入探討兩種最常見的前端安全威脅&#xff1a;跨站腳本攻擊&#xff08;XSS&#xff09;和跨站請求偽造&#xff08;CSRF&#xff09;&#xff…

uniapp 彈窗封裝(上、下、左、右、中五個方位)

無腦復制即可&#xff01;&#xff01;&#xff01; <template><view><viewv-if"mask"class"tui-drawer-mask":class"{ tui-drawer-mask_show: visible }":style"{ zIndex: maskZIndex }"tap"handleMaskClick&qu…

Axure制作可視化大屏動態滾動列表教程

在可視化大屏設計中&#xff0c;動態滾動列表是一種常見且實用的展示方式&#xff0c;能夠有效地展示大量信息。本文將詳細介紹如何使用Axure制作一個動態滾動的列表展示模塊。 一、準備工作 打開Axure軟件&#xff1a;確保你已經安裝并打開了Axure RP軟件。創建新項目&#x…

零基礎玩轉Apache Superset可視化部署

根據官方Quick Start Guide&#xff0c;你可以按照以下步驟進行部署&#xff1a; 1. 確認環境2. 獲取代碼3. 獲取官方最新代碼4. 啟動服務5. 訪問Superset Web界面6. 接入數據源 前提條件&#xff1a; dockerdocker compose 1. 確認環境 安裝Docker和Docker Compose 確保你…

服務器數據恢復—XFS文件系統分區消失的數據恢復案例

服務器數據恢復環境&故障&#xff1a; 服務器上有一組由raid卡組建的raid5磁盤陣列。上層安裝linux才做系統&#xff0c;采用XFS文件系統&#xff0c;劃分了3個分區。 管理員將服務器的操作系統重裝后&#xff0c;發現服務器上的分區發生了改變&#xff1a;一個分區消失&am…