2014-08-28 70 views
6

什麼是在Linux中創建「虛擬」文件的最直接的方式,它允許對其進行讀取操作,並始終返回某個特定命令的輸出(每次讀取文件時都運行)?因此,每個讀取操作都會導致執行一條命令,捕獲其輸出並將其作爲文件的「內容」傳遞。如何在Linux中創建虛擬命令支持的文件?

回答

4

沒有辦法創建這種所謂的「虛擬文件」。另一方面,通過FUSE在用戶空間中實現簡單的synthetic filesystem,您將成爲 能夠實現此行爲。此外,您不必使用c,即使對於諸如python的腳本語言, 也是綁定的。

編輯:而且有可能是這樣的東西已經存在:例如scriptfs

+0

謝謝,scriptfs看起來正是我要找的:-) – 2014-09-01 07:04:32

+0

然後,什麼是'cat/proc/cpuinfo'? – 2015-04-24 04:34:02

+0

@MichaelCole:cpuinfo不是一個孤立的文件,它是proc文件系統的一部分。另一個區別是procfs在內核中實現,而這個問題需要用戶空間的一個解決方案。 – marbu 2015-04-24 07:10:33

1

恐怕這是不容易的。當一個進程讀取文件時,它使用系統調用,如open,fstat,read。您需要攔截這些調用並輸出與返回內容不同的內容。這將需要編寫某種內核模塊,即使這樣它可能會變得不可能。

但是,如果你只需要在每次某個文件被訪問觸發的東西,你可以用inotifywait玩:

#!/bin/bash 

while inotifywait -qq -e access /path/to/file; do 
     echo "$(date +%s)" >> /tmp/access.txt 
done 

運行此作爲後臺進程,你會得到在每一次/tmp/access.txt一個條目正在讀取您的文件。

1

沒有人提到過,但如果您可以選擇文件的路徑,則可以使用標準輸入/dev/stdin

每次的cat程序運行時,它結束了讀取程序寫入的輸出這簡直是echo my input這裏的管:

for i in 1 2 3; do 
    echo my input | cat /dev/stdin 
done 

輸出:

my input 
my input 
my input 
2

這是一個great answer我下面複製。

基本上,named pipes可以讓你在腳本中做到這一點,並且Fuse讓我們在Python中輕鬆做到這一點。


您可能正在尋找一個named pipe

mkfifo f 
{ 
    echo 'V cebqhpr bhgchg.' 
    sleep 2 
    echo 'Urer vf zber bhgchg.' 
} >f 
rot13 < f 

寫入管道不會啓動偵聽程序。如果你想在一個循環中處理輸入,你需要保持一個監聽程序的運行。

while true; do rot13 <f >decoded-output-$(date +%s.%N); done 

請注意,寫入管道的所有數據都會合並,即使有多個進程正在寫入。如果多個進程正在讀取,則只有一個獲取數據。所以管道可能不適合併發情況。

一個已命名的套接字可以處理併發連接,但這超出了基本shell腳本的功能。

在比例尺最複雜的一端是custom filesystems,它允許您設計和安裝文件系統,其中每個文件系統都會在程序中觸發一個函數。最小投資是幾十行非平凡編碼,例如Python。如果您只想在讀取文件時執行命令,則可以使用scriptfsfuseflt