1. 程式人生 > >Linux: find命令 ‘/proc/xxxx/task/xxxx/fd/y’: No such file or directory 解決辦法

Linux: find命令 ‘/proc/xxxx/task/xxxx/fd/y’: No such file or directory 解決辦法

問題描述:

find命令查詢系統中大於50M的檔案時,有幾行報錯: No such file or directory
[email protected]:~# find / -size +50M
/proc/kcore
find: ‘/proc/6377/task/6377/fd/6’: No such file or directory
find: ‘/proc/6377/task/6377/fdinfo/6’: No such file or directory
find: ‘/proc/6377/fd/5’: No such file or directory
find: ‘/proc/6377/fdinfo/5’: No such file or directory

/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/home/qingsong/mysql-community-source_5.7.19-1ubuntu17.04_i386.deb
/home/qingsong/mysql-server_5.7.19-1ubuntu17.04_i386.deb-bundle.tar
/swapfile

原因分析:

上面的例子中,6377就是執行find命令時,find命令的PID,只在執行期間出現,等find命令執行完成之後,就會消失,報出了No such file or directory的錯誤,如果在find命令執行完成之前,按下Ctrl+z將其暫停,就能找到相應的檔案
[email protected]
:~# find / -size +50M
/proc/kcore
^Z
[1]+ Stopped find / -size +50M
[email protected]:~# ps -ef | grep -i find
root 6378 5919 1 08:16 pts/0 00:00:00 find / -size +50
root 6384 5919 0 08:16 pts/0 00:00:00 grep --color=auto -i find
[email protected]:~# ls -ld /proc/6378
dr-xr-xr-x 9 root root 0 Aug 22 08:16 /proc/6378
[email protected]
:~# jobs
[1]+ Stopped find / -size +50M
[email protected]:~# fg %1
find / -size +50M
find: ‘/proc/6378/task/6378/fd/6’: No such file or directory
find: ‘/proc/6378/task/6378/fdinfo/6’: No such file or directory
find: ‘/proc/6378/fd/5’: No such file or directory
find: ‘/proc/6378/fdinfo/5’: No such file or directory
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/home/qingsong/mysql-community-source_5.7.19-1ubuntu17.04_i386.deb
/home/qingsong/mysql-server_5.7.19-1ubuntu17.04_i386.deb-bundle.tar
/swapfile

解決辦法:

其實是查詢這些檔案時出錯,那把標準錯誤重定向一下即可,例如重定向到檔案:
[email protected]:~# find / -size +50M 2> findError.log
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/home/qingsong/mysql-community-source_5.7.19-1ubuntu17.04_i386.deb
/home/qingsong/mysql-server_5.7.19-1ubuntu17.04_i386.deb-bundle.tar
/swapfile
[email protected]:~# cat findError.log
find: ‘/proc/6394/task/6394/fd/6’: No such file or directory
find: ‘/proc/6394/task/6394/fdinfo/6’: No such file or directory
find: ‘/proc/6394/fd/5’: No such file or directory
find: ‘/proc/6394/fdinfo/5’: No such file or directory

或者丟掉:
[email protected]:~# find / -size +50M 2> /dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/home/qingsong/mysql-community-source_5.7.19-1ubuntu17.04_i386.deb
/home/qingsong/mysql-server_5.7.19-1ubuntu17.04_i386.deb-bundle.tar
/swapfile

相關知識:

linux中的標準輸入、輸出、錯誤輸出分別如下:
1. 標準輸入 (stdin) :程式碼為 0 ,使用 < 或 << ;
2. 標準輸出 (stdout):程式碼為 1 ,使用 > 或 >> ;
3. 標準錯誤輸出(stderr):程式碼為 2 ,使用 2> 或 2>> ;

如果想要將上面find命令中的標準輸出和標準錯誤分別重定向到file.lst和error.out中,可以這樣寫:
[email protected]:~# find / -size +50M > file.lst 2> error.out

如果想把"完整"的find命令的輸出都重定向到檔案中,可以使用下面的命令:
[email protected]:~# find / -size +50M > find.out 2>&1