Làm cách nào để tìm và báo cáo các liên kết tượng trưng bị hỏng tự động?


9

Là những sysadins gọn gàng, chúng tôi muốn đảm bảo rằng những điều nhỏ nhặt cũng được che đậy tốt như những điều lớn lao (khi thời gian cho phép). Một trong những điều này là đảm bảo rằng hệ thống của chúng tôi không có đầy đủ các liên kết bị hỏng.

Tại sao những kẻ gây ra vụ nổ nhỏ này là một vấn đề? Bởi vì chúng khiến bạn nghĩ rằng các tệp có ở đó khi chúng không có, chúng có thể là một dấu hiệu cho thấy điều gì đó khó chịu hơn và bởi vì phần OCD (nhỏ) của tôi phát điên với tất cả các cảnh báo khi chạy một số lệnh nhất định (như grep -r).

Vì vậy, làm thế nào một người có thể phát hiện (và báo cáo, qua e-mail hoặc hệ thống giám sát) các liên kết bị hỏng trên các bộ phận của hệ thống mà quản trị viên chịu trách nhiệm (không có điểm nào cho tôi biết rằng ~jbloggscó một loạt các liên kết bị hỏng, đó là vấn đề của anh ta )?


Câu trả lời:


7

Vấn đề với -Lđó là có tác dụng phụ là mở rộng tìm kiếm vào các thư mục con là mục tiêu của symlinks, có thể không được mong đợi hoặc mong muốn.

Với GNU findutilsphiên bản find:

<!-- language: bash -->
find /path/to/search -xtype l

ngoại trừ việc không tìm thấy các liên kết tượng trưng theo chu kỳ.

-execdir trong câu trả lời khác không phải là di động, vì vậy hãy chắt lọc nó thành một giải pháp di động tìm thấy các liên kết tượng trưng bị hỏng, bao gồm các liên kết tuần hoàn:

<!-- language: bash -->
find /path/to/search -type l -exec test ! -e {} \; -print

Xem câu hỏi này , hoặc ynform.org để thảo luận thêm. Cũng xem tài liệu findutils để biết chi tiết. Liên kết ynform.org cũng trình bày một phương pháp để chỉ phát hiện các liên kết tuần hoàn.


5

Nhiều cách để da mèo

Điều này khá di động (-L là yêu cầu tích hợp)

find -L /path/you/care/about -type l 2>/dev/null | mail -s "Broken symlinks detected" womble@example.com

Bạn đã không xác định bị hỏng, ở trên sẽ gửi cho bạn các liên kết bị hỏng không có mục tiêu trong phần hệ thống tệp mà bạn quan tâm. Nó cũng báo cáo về các vòng lặp hệ thống tập tin stderr và quá nhiều vấn đề liên kết tượng trưng, ​​vv. Nếu bạn cũng quan tâm đến chúng thì hãy chuyển hướng stderr sang mail của bạn

find -L /path/you/care/about -type l 2>&1 | mail ...

Nếu tìm thấy của bạn hỗ trợ nó -readablelà hữu ích và nhanh chóng

find /path/you/care/about -type l ! -readable | mail ...

Ở trên bao gồm các liên kết với quá nhiều mức độ vấn đề liên kết tượng trưng trong đầu ra của nó nhưng không phải là các vòng lặp của hệ thống tập tin.

Nếu các phần của hệ thống tập tin bạn quan tâm có các đường dẫn khác nhau thì

find /path/you/care/about /another/path ...

find -Llà vấn đề cho trường hợp sử dụng này. Xem: unix.stackexchange.com/a/38691/6860
sampablokuper

1

Tôi sẽ cung cấp cho bạn câu trả lời Linux và bạn có thể điều chỉnh nó cho Unix của mình, nếu cần:

find . -type l ! -execdir test -e {} \; -print >> broken_symlinks.txt; mutt -s "Broken symlinks" womble@example.com < broken_symlinks.txt; rm -f broken_symlinks.txt

Tùy chọn thứ hai là ls -LR | grep 'cannot access'hoặc một số sửa đổi từ lệnh find ở trên.

Biên tập:

Vâng, điều này thậm chí còn tốt hơn: find . -type l ! -execdir test -e {} \; -print | mail -s "Broken symlinks" womble@example.com


1
Tại sao không loại bỏ broken_symlinks.txthoàn toàn và chỉ sử dụng một đường ống? Và sử dụng mailthay vì muttgửi e-mail?
womble

0

Đây là một cách hay để thực hiện với GNU find:

find <root_dir_of_find> -follow -lname '*' | mail sysadmin -s 'Broken symlink report'

Lý do điều này hoạt động là vì -lnamevới -follow(hoặc -L) "... kiểm tra này trả về sai trừ khi liên kết tượng trưng bị hỏng", theo trang tìm kiếm.

Có lẽ sẽ là khôn ngoan khi chạy loại quét đĩa này khi máy chủ không được sử dụng nhiều. Có thể hữu ích khi sử dụng nicevà / hoặc ionice(xem blog này để biết mô tả hay về ionice ) để giảm tải cho máy chủ trong khi chạy tác vụ này.


0

Fedora và Ubuntu cung cấp symlinkstiện ích. Tiện ích này là một thực thi elf bản địa, và không phải là một kịch bản shell shell. Tiện ích đã được cài đặt sẵn trên Fedora. Bạn có thể cần cài đặt tiện ích trên Ubuntu.

Với symlinkstiện ích bạn có thể kiểm tra các liên kết lơ lửng bằng lệnh sau.

sudo symlinks -r /usr | grep dangling

Nếu các mục tiêu của các liên kết lơ lửng là OK để xóa, sau đó đưa ra các mục sau để xóa chúng.

sudo symlinks -r -d /usr

Dưới đây là một ví dụ về đầu ra trên máy chủ Fedora 31. Các debian-logo.pngubuntu-logo.pnglà chính xác.

$ sudo symlinks -r /usr | grep dangling
dangling: /usr/lib/.build-id/0a/21c737b7a56e803b12724b2bc4a8d27654ee0e -> ../../../../usr/lib64/perl5/auto/Cwd/Cwd.so
dangling: /usr/lib/.build-id/0c/352d0ca7513dad8eb098d3ad0684379a835aed -> ../../../../usr/lib64/perl5/auto/Unicode/Collate/Collate.so
dangling: /usr/lib/.build-id/1b/99d9d65010cdcc2193b873e7e825e70e23422b -> ../../../../usr/sbin/quota_nld
dangling: /usr/lib/.build-id/1c/c667de4368e4d621257070a451684c373f9952 -> ../../../../usr/sbin/rpc.rquotad
dangling: /usr/lib/.build-id/24/cfecf40f5fca30662589eb016da08a28767697 -> ../../../../usr/lib64/perl5/auto/DB_File/DB_File.so
dangling: /usr/lib/.build-id/25/42192b89d9eaf9c9782b0c22f91ee6440482cd -> ../../../../usr/lib64/dovecot/lib95_imap_filter_sieve_plugin.so
dangling: /usr/lib/.build-id/2a/a949ebff931bc3732fc396a0f2b294bb9e854b -> ../../../../usr/lib64/perl5/auto/Digest/MD5/MD5.so
dangling: /usr/lib/.build-id/34/2a46c23513258e09e87d6808b784a8b6491ff8 -> ../../../../usr/lib64/perl5/auto/Storable/Storable.so
dangling: /usr/lib/.build-id/43/e0a6db8e2b4f4aeb8f5ebb69f3cc716fc5d1cd -> ../../../../usr/lib64/perl5/auto/threads/shared/shared.so
dangling: /usr/lib/.build-id/4a/661475701d2cdcfb7d085c3e6f9bd05485d207 -> ../../../../usr/bin/coreutils.single
dangling: /usr/lib/.build-id/65/46b22b19cdfee2dfab7754d8d7ea316342151b -> ../../../../usr/lib64/perl5/auto/Compress/Raw/Zlib/Zlib.so
dangling: /usr/lib/.build-id/73/60dbe43c8b6c4a666a3bd0dc75e16a679bb784 -> ../../../../usr/lib64/libncurses++.so.6.1
dangling: /usr/lib/.build-id/7a/26a4df12398dbb4130f04a1c367a4dcc7d442b -> ../../../../usr/lib64/perl5/auto/Unicode/Normalize/Normalize.so
dangling: /usr/lib/.build-id/7f/fd3bbd111b6654bfd1b243704efa96ec2d4863 -> ../../../../usr/lib64/perl5/auto/Encode/EBCDIC/EBCDIC.so
dangling: /usr/lib/.build-id/83/2c8a2df088752fdcc9a9551ffce7b3176a4d49 -> ../../../../usr/lib64/perl5/auto/Compress/Raw/Bzip2/Bzip2.so
dangling: /usr/lib/.build-id/8b/65c6430553b93525c53d5cc2ba8fcf4ff3aaee -> ../../../../usr/lib64/perl5/auto/MIME/Base64/Base64.so
dangling: /usr/lib/.build-id/8d/c5a840771ecedd3469ee2f46d069a2eda43bf4 -> ../../../../usr/lib64/perl5/auto/Sys/Syslog/Syslog.so
dangling: /usr/lib/.build-id/91/5242c5632706f91d83e37781b0f9f3fea7095e -> ../../../../usr/lib64/perl5/auto/Encode/JP/JP.so
dangling: /usr/lib/.build-id/ce/88cf936cb7a769cb86fc5a6573e9eb1dd34f11 -> ../../../../usr/sbin/warnquota
dangling: /usr/lib/.build-id/cf/4163f54ccf50ecdf167458d9c191340923e397 -> ../../../../usr/lib64/dovecot/lib90_sieve_plugin.so
dangling: /usr/lib/.build-id/db/462bcd4628914e304d29efdb91c9ef4c8a429c -> ../../../../usr/libexec/dovecot/managesieve
dangling: /usr/lib/.build-id/e4/d5521acb2c6258e041ce769b598b2321b1b759 -> ../../../../usr/lib64/perl5/auto/threads/threads.so
dangling: /usr/lib/.build-id/e8/90366944201ec9b95741c6412384694bdd7512 -> ../../../../usr/lib64/perl5/auto/Data/Dumper/Dumper.so
dangling: /usr/lib/.build-id/e8/249d9630ae331b9202bae7f673e9252fa7253b -> ../../../../usr/sbin/xfs_scrub
dangling: /usr/lib/.build-id/e9/84aa80676f59c7c2509cbff7adc9c75eda481f -> ../../../../usr/lib64/perl5/auto/Encode/TW/TW.so
dangling: /usr/lib/.build-id/eb/adfc3dbd92dd3c040503abd748801b545cc86f -> ../../../../usr/lib64/perl5/auto/Time/Piece/Piece.so
dangling: /usr/lib/.build-id/f1/9dc36368503cdc9fefccc69d5746b63e47908d -> ../../../../usr/libexec/dovecot/managesieve-login
dangling: /usr/lib/.build-id/f4/39e5769bde9d9f8d4544c8f71196ad71ac5f51 -> ../../../../usr/lib64/perl5/auto/Encode/Symbol/Symbol.so
dangling: /usr/lib/.build-id/f5/78cbcea9f6912e60cdddb66910261996ad6141 -> ../../../../usr/lib64/perl5/auto/Encode/Byte/Byte.so
dangling: /usr/lib/.build-id/fc/6f59624f604d702f001f613defb4e076937073 -> ../../../../usr/lib64/perl5/auto/Encode/CN/CN.so
dangling: /usr/lib/.build-id/55/4466f3ba07d8c68e182f4664bea89edc6ca977 -> ../../../../usr/lib64/perl5/auto/Encode/KR/KR.so
dangling: /usr/lib/.build-id/9b/b76a0d6b526ae41ae293e3a380965d6dfbcddb -> ../../../../usr/lib64/perl5/auto/Encode/Encode.so
dangling: /usr/lib/.build-id/e5/9f2cc2a60b3c93cb80f676cb10c33947fff9e1 -> ../../../../usr/lib64/perl5/auto/Filter/Util/Call/Call.so
dangling: /usr/lib/.build-id/1e/0069b4c149b951f05d0a5cc7e422c776fb3e41 -> ../../../../usr/lib64/python3.7/site-packages/gi/_gi_cairo.cpython-37m-x86_64-linux-gnu.so
dangling: /usr/lib/.build-id/36/2656ff4bc2e2d6cd08cd86aa629fecfb37e313 -> ../../../../usr/lib64/perl5/auto/Devel/Peek/Peek.so
dangling: /usr/lib/.build-id/f2/166998840d21e70379abff23a98988717afc3a -> ../../../../usr/lib64/perl5/auto/Digest/SHA/SHA.so
dangling: /usr/lib/.build-id/0d/af1e73e410de195ea920b2384fc69d410ec087 -> ../../../../usr/lib64/perl5/auto/List/Util/Util.so
dangling: /usr/lib/.build-id/d3/46ece08a996170f1e5033ba95d18e2254f54ed -> ../../../../usr/lib64/perl5/auto/Socket/Socket.so
dangling: /usr/lib/.build-id/69/74f3ebcf11fa8d9a19ee54eb50af14be2f42dc -> ../../../../usr/lib64/dovecot/doveadm/lib10_doveadm_sieve_plugin.so
dangling: /usr/lib/.build-id/69/9bacf31170b09a56bb033ede6581984d33c0f7 -> ../../../../usr/lib64/perl5/auto/Time/HiRes/HiRes.so
dangling: /usr/lib/.build-id/96/26d1666cace24a81ee5a77fe9e579258ac342e -> ../../../../usr/lib64/libncurses++w.so.6.1
dangling: /usr/lib/.build-id/5c/c6279fd36f22e35b83b0ac73356dc1a4d76df1 -> ../../../../usr/lib64/perl5/auto/Encode/Unicode/Unicode.so
dangling: /usr/lib/.build-id/9c/ff1249bda228d9278c9c347d0cab4437056810 -> ../../../../usr/lib64/perl5/auto/IPC/SysV/SysV.so
dangling: /usr/lib/.build-id/5e/213a5bf6193f8184edda1f6278c30a9acaf694 -> ../../../../usr/lib64/perl5/auto/Math/BigInt/FastCalc/FastCalc.so
dangling: /usr/lib/.build-id/53/f0c8286103cbd403235e800f53d4b023671916 -> ../../../../usr/lib64/dovecot/lib95_imap_sieve_plugin.so
dangling: /usr/lib/modules/5.3.11-300.fc31.x86_64/build -> /usr/src/kernels/5.3.11-300.fc31.x86_64
dangling: /usr/lib/modules/5.3.11-300.fc31.x86_64/source -> build
dangling: /usr/lib/lsb/install_initd -> ../../../sbin/chkconfig
dangling: /usr/lib/lsb/remove_initd -> ../../../sbin/chkconfig
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libasan.a -> ../../../i686-redhat-linux/9/libasan.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libatomic.a -> ../../../i686-redhat-linux/9/libatomic.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libgomp.so -> ../../../../libgomp.so.1.0.0
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libitm.a -> ../../../i686-redhat-linux/9/libitm.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libquadmath.a -> ../../../i686-redhat-linux/9/libquadmath.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libubsan.a -> ../../../i686-redhat-linux/9/libubsan.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++.a -> ../../../i686-redhat-linux/9/libstdc++.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++.so -> ../../../../libstdc++.so.6.0.27
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++fs.a -> ../../../i686-redhat-linux/9/libstdc++fs.a
dangling: /usr/lib/gcc/x86_64-redhat-linux/9/32/libsupc++.a -> ../../../i686-redhat-linux/9/libsupc++.a
dangling: /usr/share/doc/hunspell/README -> README.md
dangling: /usr/share/man/man7/gnupg2.7.gz -> gnupg.7.gz
dangling: /usr/share/man/man1/ex.1.gz -> vim.1.gz
dangling: /usr/share/man/man1/rview.1.gz -> vim.1.gz
dangling: /usr/share/man/man1/view.1.gz -> vim.1.gz
dangling: /usr/share/cockpit/branding/debian/favicon.ico -> /usr/share/pixmaps/debian-logo.png
dangling: /usr/share/cockpit/branding/debian/logo.png -> /usr/share/pixmaps/debian-logo.png
dangling: /usr/share/cockpit/branding/ubuntu/logo.png -> /usr/share/plymouth/ubuntu-logo.png
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.