2014-12-31 17 views
5

Tôi đang gặp sự cố trong tập lệnh shell. Tôi thu hẹp vấn đề và thấy rằng đó là vì một bộ mô tả tập tin từ đầu vào tiêu chuẩn mà không được tạo ra trong hệ thống tập tin proc. đây dưới đây là kịch bản thử nghiệm mà tôi đã viết:mô tả tệp không được tạo

#!/bin/ksh 


var=`ls -lrt /proc/$$/path/0` 
echo $var 


if [[ -f /proc/$$/path/0 ]] 
then 
echo "found file descriptor" 
else 
echo "file descriptor not found" 
fi 

Tôi thử nghiệm này trong/tmp/thư mục với một tập tin đầu vào mẫu:

$ ./checkip.sh < /tmp/testip 
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/19358/path/0 -> /tmp/testip 
found file descriptor 

Bây giờ tôi thử nghiệm tại một trong những thư mục mà chúng tôi đang đối mặt với một vấn đề.

$ ./checkip.sh < /var/opt/xxxxxxxx/testip 
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/20124/path/0 
file descriptor not found 
$ 

Tôi nghĩ có thể là do thư mục xxxxxxxx. vì vậy tôi đã thử lại điều này với một tệp trong thư mục mẹ.

$ ./checkip.sh < /var/opt/testip 
lrwxrwxrwx 1 root root 0 Dec 31 09:16 /proc/21286/path/0 -> /var/opt/testip 
found file descriptor 
$ 

Nó hoạt động trở lại. Nhưng tôi không thấy bất kỳ sự khác biệt nào giữa quyền truy cập thư mục của opt và xxxxxxxx

$ ls -l |grep xxxxxxxx 
drwxr-xr-x 292 abcdefg abc   8192 Dec 31 08:33 xxxxxxxx 
$ cd .. 
$ ls -l | grep opt 
drwxr-xr-x 17 abcdefg abc   512 Dec 31 09:14 opt 

Tôi nhầm lẫn tại sao liên kết tượng trưng cho 0 (đầu vào chuẩn) không được tạo đúng cách. Có ai có thể giúp tôi tìm lý do cho việc này không?

EDIT -Đối với những nhận xét

tập tin không tồn tại

$ ./checkip.sh < /tmp/notexistfile 
/tmp/notexistfile: No such file or directory. 

tập tin tồn tại

$ ./checkip.sh < /var/opt/testip 
lrwxrwxrwx 1 root root 0 Dec 31 10:49 /proc/15917/path/0 -> /var/opt/testip 
found file descriptor 

tập tin tồn tại

$ ./checkip.sh < /var/opt/xxxxxxxx/testip 
lrwxrwxrwx 1 root root 0 Dec 31 10:49 /proc/16566/path/0 
file descriptor not found 
$ 

Vấn đề ở đây tôi có thể thấy là liên kết tượng trưng cho đầu vào tiêu chuẩn trong proc/pid/path/0 không được tạo cho một thư mục. Nhưng những gì có thể là lý do .. Tôi ra khỏi ý tưởng !. Ngay cả đầu ra giàn không hiển thị bất cứ điều gì về cách các tập tin (sym link) proc/pid/path/0 được tạo ra.

Truss đầu ra: làm việc trường hợp (kiểm tra stat64 gọi thành công):

9107/1:   0.0117 read(62, 0xFEF687A0, 1024)      = 116 
9107/1:   # !/b i n/k s h\n\n i f [ [  - f /p r o c/$ $/p 
9107/1:   a t h/0 ] ]\n t h e n\n e c h o " f o u n d f i l e d 
9107/1:   e s c r i p t o r "\n e l s e\n e c h o " f i l e d e s c r 
9107/1:   i p t o r n o t f o u n d "\n f i\n 
9107/1:   0.0118 sysconfig(6)         = 4096 
9107/1:   0.0119 stat64(0x0808E630, 0x08089B40)     = 0 
9107/1:    0x0808E630: "/proc/9107/path/0" 
9107/1:    d=0x04F40002 i=4191608033 m=0100644 l=1 u=308 g=205 sz=3 
9107/1:     at = Dec 31 08:33:06 GMT 2014 [ 1420014786.307569314 ] 
9107/1:     mt = Dec 31 08:33:06 GMT 2014 [ 1420014786.307619723 ] 
9107/1:     ct = Dec 31 08:33:06 GMT 2014 [ 1420014786.307619723 ] 
9107/1:    bsz=4096 blks=8  fs=tmpfs 

đầu ra kèo:

10125/1:   0.0057 read(62, 0xFEF687A0, 1024)      = 116 
10125/1:   # !/b i n/k s h\n\n i f [ [  - f /p r o c/$ $/p 
10125/1:   a t h/0 ] ]\n t h e n\n e c h o " f o u n d f i l e d 
10125/1:   e s c r i p t o r "\n e l s e\n e c h o " f i l e d e s c r 
10125/1:   i p t o r n o t f o u n d "\n f i\n 
10125/1:   0.0058 sysconfig(6)         = 4096 
10125/1:   0.0071 stat64(0x0808E630, 0x08089B40)     Err#2 ENOENT 
10125/1:    0x0808E630: "/proc/10125/path/0" 
10125/1:   0.0071 lwp_sigmask(3, 0x00020000, 0x00000000)   = 0xFFBFFEFF [0x0000FFFF] 
10125/1:   0.0071 stat64(0x0808E792, 0x08047600)     Err#2 ENOENT 
10125/1:    0x0808E792: "/usr/sbin/echo" 
10125/1:   0.0072 lwp_sigmask(3, 0x00000000, 0x00000000)   = 0xFFBFFEFF [0x0000FFFF] 
10125/1:   0.0072 lwp_sigmask(3, 0x00020000, 0x00000000)   = 0xFFBFFEFF [0x0000FFFF] 
+0

Có thể bạn đã làm xáo trộn nguyên nhân của vấn đề? Là chủ sở hữu bình đẳng, là dir/var/opt/xxxxxxxx một liên kết tượng trưng? Phản hồi khi bạn gọi checkip.sh bằng một tệp không tồn tại hoặc với một tệp không có quyền đọc là gì? –

+0

cách Id đi về xử lý sự cố này là sử dụng các cuộc gọi hệ thống strace và grep cho các cuộc gọi hệ thống tạo ra mô tả tập tin. Đọc hướng dẫn tại đây: http://ss64.com/bash/strace.html ETA: Tôi thấy bạn đã cố gắng truss. – grasshopper

+0

Tốt để biết về strace nhưng tiếc là tôi đang gặp lỗi sau.'ERROR: tracer đã tồn tại' – user1939168

Trả lời

0

Đây là xuống: không trường hợp (kiểm tra stat64 gọi thất bại) ngày làm việc vào câu lệnh "if [-f" của bạn. Nó đặc biệt kiểm tra xem có tồn tại FILE (-f) hay không. Những gì bạn đã có trong tất cả các ví dụ là các liên kết, chứ không phải các tệp. Độ phân giải của các liên kết đó xác định xem truy vấn -f có hài lòng hay không. Khi tôi kiểm tra các kết quả/var với một ls trên hệ thống của riêng tôi, liên kết trỏ đến một thiết bị đặc biệt ký tự, mà sẽ không thỏa mãn tiêu chí -f "tệp tồn tại".

Tôi đang nhầm lẫn về hướng vào tập lệnh. Tôi không thấy bất cứ nơi nào mà nó thực sự sử dụng đầu vào mà bạn chỉ định. "Var" hoàn toàn tự chứa trong tập lệnh như bạn đã chỉ định ở trên. Để có được -f làm việc trên một tên tập tin cụ thể, bạn phải làm một cái gì đó dọc theo dòng nếu [-f $ 1] (trừ khi kịch bản của bạn thay đổi giữa bài đăng và ví dụ chạy).

0

tôi đã có thể tái tạo các hành vi tương tự bằng cách loại bỏ các tập tin ở phần đầu của kịch bản:

# cat ./aaa 
#!/bin/ksh 

rm -f /tmp/file.tmp 

var=`ls -lrt /proc/$$/path/0` 
echo $var 
if [[ -f /proc/$$/path/0 ]]; then 
    echo "found file descriptor" 
else 
    echo "file descriptor not found" 
fi 

Sau đó:

# touch /tmp/file.tmp 
# ./aaa < /tmp/file.tmp 
lrwxrwxrwx 1 root root 0 Dec 25 14:52 /proc/784/path/0 
file descriptor not found 

Đề nghị của tôi là để thực hiện ls -li /var/opt/xxxxxxxx/testip một vài lần và tôi Gần như chắc chắn bạn sẽ thấy inode khác nhau với mỗi lần chạy, hoặc chạy nó trước và sau khi thực thi kịch bản.

Tôi nghĩ rằng trong trường hợp của bạn tập tin bị ghi đè bởi một cái gì đó khác và bạn luôn thấy tệp hiện tại nhưng khi bạn khởi chạy tập lệnh này, chuyển hướng sẽ mở để đọc tệp từ một inode nhất định và trước khi lệnh 1 được thực hiện, tệp đầu vào được viết lại thành một inode khác mà không biết đến tập lệnh.

Các vấn đề liên quan