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]
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ì? –
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
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