มีข้อเสียคือการลบลิงก์สัญลักษณ์ที่เสียทั้งหมดในระบบหรือไม่?


46

ฉันกำลังเรียกใช้สคริปต์ที่วนซ้ำไฟล์ทั้งหมดในระบบ Linux ของฉันและสร้างข้อมูลเมตาเกี่ยวกับพวกเขาและมันเกิดข้อผิดพลาดเมื่อกดลิงค์สัญลักษณ์ที่เสียหาย

ฉันใหม่ถึง * ระวัง แต่ฉันได้รับแนวคิดหลักที่อยู่เบื้องหลังการเชื่อมโยงไฟล์และการเชื่อมโยงที่ขาดหายไปมีอยู่จริง เท่าที่ฉันรู้พวกเขาก็เหมือนขยะในท้องถนน สิ่งที่โปรแกรมที่ฉันลบไม่ฉลาดพอที่จะบอกว่าตัวจัดการแพคเกจนั้นมีอยู่และเป็นของมันหรือสิ่งที่ทิ้งไว้ในการอัปเกรด ในตอนแรกฉันเริ่มปรับแต่งสคริปต์ที่ฉันกำลังจะข้ามไปจากนั้นฉันก็คิดว่า 'เราสามารถลบมันได้ตลอดเวลาเมื่อเราอยู่ที่นี่ ... '

ฉันใช้Ubuntu 14.04 (Trusty Tahr) ฉันไม่เห็นเหตุผลใด ๆ ที่จะทำ แต่ก่อนที่ฉันจะดำเนินการเรื่องนี้ผ่านระบบการพัฒนาของฉันมีเหตุผลใด ๆ ที่จริง ๆ แล้วนี่อาจเป็นความคิดที่แย่มาก? symlink ที่ใช้งานไม่ได้นั้นมีจุดประสงค์บางอย่างที่ฉันไม่ทราบหรือไม่?


7
ใช่: เห็นคำตอบที่ถูก ticked แต่ที่สำคัญกว่านั้นไม่ใช่วิธีการแก้ปัญหาของคุณ: สคริปต์ต้องทำงานอย่างถูกต้องไม่ใช่แค่ระบบที่ถูกสุขอนามัย ระบบอาจกลายเป็น½milisecondที่ถูกทำให้สะอาดระหว่างการทำให้ถูกสุขลักษณะและในช่วงครึ่งหลังของสคริปต์ที่ทำงานอยู่ สิ่งนี้ยังละเมิดหลักการความรับผิดชอบเดี่ยวและปรัชญา Unix:“ ทำสิ่งหนึ่งสิ่งที่ดี”
ctrl-alt-delor

คำตอบ:


68

มีหลายสาเหตุที่ทำให้ลิงก์สัญลักษณ์เสีย:

  • ลิงก์ถูกสร้างไปยังเป้าหมายที่ไม่มีอยู่อีกต่อไป
    การแก้ไข: ลบ symlink ที่เสียหาย
  • ลิงค์ถูกสร้างขึ้นสำหรับเป้าหมายที่ถูกย้ายไปแล้ว หรือเป็นลิงก์ที่เชื่อมโยงซึ่งสัมพันธ์กับเป้าหมาย (ไม่ได้บอกเป็นนัยว่า symlink แบบสัมพัทธ์เป็นความคิดที่ไม่ดี - ค่อนข้างตรงกันข้าม: symlink แบบสัมบูรณ์มีแนวโน้มที่จะค้างเนื่องจากการย้ายเป้าหมาย) การ
    แก้ไข: ค้นหาเป้าหมายที่ต้องการและแก้ไขลิงก์
  • มีข้อผิดพลาดเมื่อสร้างลิงก์
    การแก้ไข: ค้นหาเป้าหมายที่ต้องการและแก้ไขลิงก์
  • ลิงก์คือไฟล์ที่อยู่บนดิสก์แบบถอดได้ระบบไฟล์เครือข่ายหรือพื้นที่เก็บข้อมูลอื่น ๆ ที่ไม่ได้ติดตั้งอยู่ในปัจจุบัน การแก้ไข: ไม่มีลิงก์จะไม่เสียหายตลอดเวลา ลิงก์จะทำงานเมื่อมีการติดตั้งพื้นที่เก็บข้อมูล
  • ลิงค์ไปยังไฟล์ที่มีอยู่เพียงบางครั้งโดยการออกแบบ ตัวอย่างเช่นไฟล์เป็นเอาต์พุตแคชของกระบวนการซึ่งจะถูกลบเมื่อข้อมูลหยุดทำงาน แต่ถูกสร้างขึ้นใหม่เมื่อมีการร้องขออย่างชัดเจนเท่านั้น หรือลิงค์ไปยังกล่องจดหมายซึ่งจะถูกลบเมื่อว่างเปล่า หรือลิงค์ไปยังไฟล์อุปกรณ์ซึ่งจะปรากฏเฉพาะเมื่อเชื่อมต่ออุปกรณ์ต่อพ่วงที่เกี่ยวข้อง การแก้ไข: ไม่มีลิงก์จะไม่เสียหายตลอดเวลา
  • ลิงก์ใช้ได้ในลำดับชั้นการจัดเก็บที่ต่างกันเท่านั้น ตัวอย่างเช่นจะใช้ได้เฉพาะในคุก chroot หรือส่งออกโดยเซิร์ฟเวอร์ NFS และใช้ได้เฉพาะบนเซิร์ฟเวอร์หรือลูกค้าบางราย
    การแก้ไข: ไม่มีลิงก์จะไม่เสียหายในทุกที่
  • ลิงก์เสียสำหรับคุณเนื่องจากคุณขาดสิทธิ์ในการสำรวจไดเรกทอรีเพื่อเข้าถึงเป้าหมาย แต่จะไม่เสียหายสำหรับผู้ใช้ที่มีสิทธิ์ที่เหมาะสม
    การแก้ไข: ไม่มีลิงก์จะไม่เสียหายสำหรับทุกคน
  • ลิงค์ที่ใช้ในการเก็บข้อมูลในขณะที่ตัวอย่างเช่นล็อค Firefox โดยอ้าง vinc17 เหตุผลหนึ่งที่ทำได้ด้วยวิธีนี้คือการใส่ symlink แบบอะตอมง่ายกว่า - ไม่มีวิธีอื่นในขณะที่การเติมไฟล์ atomically มีความซับซ้อนมากขึ้น: คุณต้องสร้างเนื้อหาไฟล์ภายใต้ชื่อชั่วคราวจากนั้นย้ายไปไว้ที่อื่นและ จัดการกับไฟล์ชั่วคราวเก่าค้างโดยความผิดพลาด อีกสาเหตุหนึ่งคือ symlink นั้นจะถูกจัดเก็บโดยตรงภายใน inode บนระบบไฟล์บางระบบซึ่งทำให้การอ่านเร็วกว่าการอ่านเนื้อหาของไฟล์
    ความละเอียด: ไม่มี ในกรณีนี้การลบลิงค์จะเป็นอันตราย

หากคุณสามารถกำหนดว่า symlink อยู่ในหมวดหมู่แรกให้แน่ใจว่าไปข้างหน้าและลบมัน มิฉะนั้นงด

โปรแกรมที่สำรวจไดเรกทอรีซ้ำ ๆ และสนใจเนื้อหาของไฟล์ควรละเว้นลิงก์สัญลักษณ์ที่เสียหาย


symlink คือ (โดยทั่วไป) ไม่อยู่ในไดเรกทอรีหลัก อย่างไรก็ตามในบางระบบไฟล์เป้าหมายลิงก์จะถูกเก็บไว้ในไอโหนด
James Youngman

รายการที่ดีมาก ฉันมีลิงค์เชื่อมโยงมากมายทั้งชนิดที่ 4 และ 6 พวกเขาชี้ไปที่ระบบไฟล์ที่ฉันติดตั้งด้วย SSHFS เมื่อระบบไฟล์ไม่ถูกเมานท์พวกเขากำลังพิมพ์ 4 เมื่อระบบไฟล์ติดตั้งเฉพาะฉันเท่านั้นที่สามารถเข้าถึงได้ดังนั้นพวกเขาจึงพิมพ์ 6 สำหรับทุกคน (แม้แต่รูท)
Barmar

สาเหตุที่เป็นไปได้อีกประการหนึ่งสำหรับ symlink ที่ใช้งานไม่ได้: symlink ไปยังไฟล์จริงที่มีอยู่เพียงบางครั้งเท่านั้น เช่นในเวิร์กโฟลว์ที่มีพา ธ ลึกคุณอาจมี symlink ไปยังไฟล์งาน (เพื่อความสะดวก) ซึ่งจะถูกลบเมื่อเวิร์กโฟลว์เสร็จสมบูรณ์ แต่จะถูกสร้างขึ้นใหม่ในระหว่างการใช้งานลำดับถัดไป / dev / modem เป็นแบบนั้นเพราะไฟล์อุปกรณ์จริงมันชี้ไปที่มีอยู่เมื่อเชื่อมต่ออุปกรณ์ฟิสิคัลเท่านั้น
โจ

ค่อนข้างคำตอบที่ครอบคลุม!
njzk2

1
@MichaelDurrant เอ๊ะ? ประเด็นก็คือข้อเสีย (หรือขาดของมัน) ขึ้นอยู่กับว่า symlink ที่เสียหายเกิดขึ้นได้อย่างไร
Gilles 'หยุดความชั่วร้าย'

19

อย่าลบลิงค์สัญลักษณ์ห้อยต่องๆทั้งหมด พวกมันอาจมีอยู่เพื่อส่งข้อมูลบางอย่างและอาจปลอดภัยกว่าไฟล์ปกติเนื่องจากการสร้าง symlink เป็นแบบอะตอมมิก

ตัวอย่างเช่น Firefox สร้าง lockfile "lock" ซึ่งเป็น symlink ที่มีค่ามีรูปแบบเช่น "IP_address: + PID"


1
เช่นเดียวกับโปรแกรมอาจเติมไฟล์ว่างแบบไดนามิกที่หนึ่งใน symlink เหล่านี้เป็นลิงค์ที่เสียหายไปในขณะที่โปรแกรมไม่ทำงาน ? หรืออาจเป็นเพียงข้อมูลชิ้นหนึ่ง
blank_cat

1
@knotech วัตถุประสงค์ของการเชื่อมโยงบางอย่าง (ไม่จำเป็นต้องเกี่ยวข้องกับโปรแกรมที่กำลังทำงานอยู่) อาจมีอยู่จริง คุณค่าของพวกเขาอาจไม่มีความหมายหรือสื่อถึงข้อมูลบางอย่าง ในทั้งสองกรณีโดยทั่วไปพวกเขาชี้ไปที่ไม่มีอะไร ไม่มีไฟล์ว่างเปล่าเป็นเพียง symlink ตัวอย่างเช่นกรณีของ gcc builds ซึ่งสร้างการเชื่อมโยง
vinc17

6

ทั้งfnordและGatling webserver ใช้ระบบไฟล์ Unix เป็นฐานข้อมูลการกำหนดค่าของพวกเขา (ตรงข้ามกับ Microsoft IIS ซึ่งใช้รีจิสตรีของ Windows หรือ Apache ซึ่งใช้ไฟล์กำหนดค่าแบบซับซ้อนเพื่อแยกวิเคราะห์)

ตัวอย่างเช่นโฮสต์เสมือนเป็นเพียงไดเรกทอรีและการสร้างโฮสต์เสมือนใหม่นั้นง่ายเหมือน

mkdir www.example.com:80

การกำหนดค่าไฟล์ที่จะให้บริการ?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

การกำหนดค่าไฟล์ที่จะเรียกใช้งานเป็น CGI และไฟล์ใดที่จะให้บริการ?

chmod a-x plain_file.html
chmod a+x cgi_script.html

และสุดท้าย (และเกี่ยวข้องกับคำถามนี้): การกำหนดค่าการเปลี่ยนเส้นทางหรือไม่

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

ตอนนี้คุณจะมี symlink ที่เรียกว่าsearch.htmlจุดไหน แต่มันมีความสำคัญต่อการทำงานของเว็บไซต์ของคุณ


0

symlink อาจชี้ไปที่ตำแหน่งที่ยัง emty เพียงเพื่อบังคับให้สร้างที่ตำแหน่งระบบไฟล์เฉพาะหรือชื่อ

ดังนั้นไม่ - อย่าลบพวกเขาอย่างสุ่ม


0

ข้อเสียที่สำคัญในการลบลิงค์สัญลักษณ์ค้างคือคุณสูญเสียการอ้างอิงไปยังที่ที่พวกเขาเคยชี้ให้เห็นว่าจะมีคุณค่ามาก!

สมมติว่าฉันมีลิงก์สัญลักษณ์สำหรับไฟล์ชื่อ " send_to" ซึ่งชี้ไปที่/Users/myname/tmpและสมมติว่า/Users/myname/tmpไม่มีอยู่

ด้วยลิงก์สัญลักษณ์ฉันรู้ว่าไฟล์นี้ตั้งใจจะอยู่ที่ใด ตัวอย่างเช่นในกรณีนี้ฉันเห็นว่ามันเป็นไดเรกทอรีชั่วคราวและถ้าฉันต้องการ "แก้ไข" มันฉันควรพิจารณาไดเรกทอรีชั่วคราวเป็นปลายทาง

ในทำนองเดียวกันลิงก์ " my_config" ที่ชี้ไป/etc/conf_fileที่ "ไม่ดี" เนื่องจากconf_fileการเปลี่ยนชื่อเป็น confirm_file ยังคงเป็นข้อมูลที่เป็นประโยชน์ หากคุณไปที่/etcไดเรกทอรีและทำlsและเห็นไฟล์ที่เรียกว่าconf_fileหายไป แต่confirmation_fileอยู่ที่นั่นคุณอาจมีข้อมูลเพียงพอที่จะแก้ไขลิงก์ในขณะนี้


-2

อ้างจากบรรทัดคำสั่ง Linux (หนังสือที่ดีที่สุดที่เคยสำหรับมือใหม่ Linux และคุณสามารถดาวน์โหลดได้ฟรีที่นี่ ):

นึกภาพสถานการณ์นี้: โปรแกรมต้องการใช้ทรัพยากรที่ใช้ร่วมกันบางชนิดที่อยู่ในไฟล์ชื่อ“ foo” แต่“ foo” มีการเปลี่ยนแปลงเวอร์ชั่นบ่อยครั้ง เป็นการดีที่จะรวมหมายเลขเวอร์ชันในชื่อไฟล์เพื่อให้ผู้ดูแลระบบหรือผู้มีส่วนได้เสียอื่น ๆ เห็นว่ามีการติดตั้ง“ foo” รุ่นใด สิ่งนี้นำเสนอปัญหา หากเราเปลี่ยนชื่อของทรัพยากรที่ใช้ร่วมกันเราต้องติดตามทุกโปรแกรมที่อาจใช้และเปลี่ยนเพื่อค้นหาชื่อทรัพยากรใหม่ทุกครั้งที่มีการติดตั้งทรัพยากรรุ่นใหม่ นั่นไม่ได้ฟังดูสนุกเลย

นี่คือที่ที่ลิงก์สัญลักษณ์บันทึกทุกวัน สมมติว่าเราติดตั้ง“ foo” รุ่น 2.6 ซึ่งมีชื่อไฟล์“ foo-2.6” แล้วสร้างลิงค์สัญลักษณ์ที่เรียกว่า“ foo” ซึ่งชี้ไปที่“ foo-2.6” ซึ่งหมายความว่าเมื่อโปรแกรมเปิดไฟล์“ foo” มันคือการเปิดไฟล์“ foo-2.6” ตอนนี้ทุกคนมีความสุข โปรแกรมที่ใช้“ foo” สามารถค้นหาได้และเรายังสามารถดูว่ามีการติดตั้งเวอร์ชันจริงอะไร เมื่อถึงเวลาอัพเกรดเป็น“ foo-2.7” เราเพิ่งเพิ่มไฟล์ไปยังระบบของเราลบลิงก์สัญลักษณ์“ foo” และสร้างไฟล์ใหม่ที่ชี้ไปที่เวอร์ชันใหม่ สิ่งนี้ไม่เพียงช่วยแก้ปัญหาการอัพเกรดเวอร์ชั่น แต่ยังช่วยให้เราสามารถเก็บทั้งสองรุ่นไว้ในเครื่องของเราได้ ลองจินตนาการว่า "foo-2.7" มีข้อผิดพลาด (ด่าผู้พัฒนาเหล่านั้น!) และเราจำเป็นต้องเปลี่ยนกลับเป็นเวอร์ชันเก่า อีกครั้ง

ดังนั้นไม่ฉันจะไม่ลบลิงก์สัญลักษณ์เนื่องจากจะปวดหัวอย่างต่อเนื่องและคุณเสี่ยงต่อการทำให้ระบบของคุณสับสน


6
OP ไม่ได้เรียกร้องให้ลบศาลที่มีการเชื่อมโยงซึ่งมีเพียงsymlinks ที่เสียเท่านั้นเช่น symlinks ที่ไม่ได้ชี้ไปที่ไฟล์ที่มีอยู่ในปัจจุบัน
LSerni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.