คำถามติดแท็ก open-files

การจัดการกับไฟล์ที่เปิดอยู่ในโปรแกรม

3
ทำไมจำนวนไฟล์ที่เปิดอยู่ จำกัด ใน Linux?
ตอนนี้ฉันรู้วิธี: ค้นหาการ จำกัด การเปิดไฟล์ต่อกระบวนการ: ulimit -n นับจำนวนไฟล์ที่เปิดทั้งหมดโดยกระบวนการทั้งหมด: lsof | wc -l รับจำนวนไฟล์ที่เปิดสูงสุดที่อนุญาต: cat /proc/sys/fs/file-max คำถามของฉันคือเหตุใดจึงมีข้อ จำกัด ของไฟล์ที่เปิดอยู่ใน Linux?
136 open-files  limit 

3
ค้นหาและลบไฟล์ขนาดใหญ่ที่เปิดอยู่ แต่ถูกลบไปแล้ว
จะพบไฟล์ขนาดใหญ่ที่ถูกลบ แต่ยังคงเปิดอยู่ในแอปพลิเคชั่นได้อย่างไร? เราจะลบไฟล์นั้นออกได้อย่างไรแม้ว่ากระบวนการจะเปิดขึ้นมาก็ตาม สถานการณ์คือเรากำลังเรียกใช้กระบวนการที่เติมไฟล์บันทึกในอัตราที่ยอดเยี่ยม ฉันรู้เหตุผลและฉันสามารถแก้ไขได้ ก่อนหน้านี้ฉันต้องการ rm หรือล้างไฟล์บันทึกโดยไม่ต้องปิดกระบวนการ เพียงแค่ทำการrm output.logลบการอ้างอิงไปยังไฟล์เท่านั้น แต่จะยังคงใช้พื้นที่บนดิสก์ต่อไปจนกว่ากระบวนการจะสิ้นสุดลง แย่ลง: หลังจากrmวันนี้ฉันไม่มีทางที่จะค้นหาไฟล์หรือว่ามันใหญ่แค่ไหน! มีวิธีใดในการค้นหาไฟล์และอาจทำให้มันว่างเปล่าแม้ว่ามันจะยังคงเปิดอยู่ในกระบวนการอื่นหรือไม่? ฉันอ้างถึงระบบปฏิบัติการบน Linux เป็นพิเศษเช่น Debian หรือ RHEL

2
ulimit: ความแตกต่างระหว่างขีด จำกัด แบบแข็งและแบบอ่อน
อะไรคือความแตกต่างระหว่างขีด จำกัด ที่แข็งและอ่อนใน ulimit? สำหรับจำนวนไฟล์ที่เปิดฉันมีขีด จำกัด ซอฟต์ 1024 และขีด จำกัด ฮาร์ด 10240 มันเป็นไปได้ที่จะรันโปรแกรมที่เปิดมากกว่า 1024 ไฟล์ ขีด จำกัด ซอฟต์คืออะไร?

7
ฉันจะทราบได้อย่างไรว่ากระบวนการใดบ้างที่ป้องกันไม่ให้ถอดอุปกรณ์ออก
บางครั้งฉันต้องการยกเลิกการต่อเชื่อมอุปกรณ์ usbด้วยumount /run/media/theDriveแต่ฉันได้รับdrive is busyข้อผิดพลาด ฉันจะทราบได้อย่างไรว่ากระบวนการหรือโปรแกรมใดกำลังใช้งานอุปกรณ์อยู่

7
ใครมีปลายอีกด้านของซ็อกเก็ตยูนิกซ์นี้?
ฉันต้องการตรวจสอบว่ากระบวนการใดมีส่วนอื่น ๆ ของซ็อกเก็ต UNIX โดยเฉพาะฉันถามเกี่ยวกับสิ่งที่สร้างขึ้นด้วยsocketpair()แม้ว่าปัญหาจะเหมือนกันสำหรับซ็อกเก็ต UNIX ใด ๆ ผมมีโปรแกรมparentที่สร้างsocketpair(AF_UNIX, SOCK_STREAM, 0, fds)และfork()s กระบวนการหลักปิดfds[1]และfds[0]ทำการสื่อสารต่อไป close(fds[0]); s=fds[1]เด็กไม่ตรงข้าม จากนั้นเด็กก็เข้าexec()ร่วมโปรแกรมอื่น, child1. ทั้งสองสามารถสื่อสารไปมาผ่านซ็อกเก็ตคู่นี้ได้ ตอนนี้ขอบอกว่าฉันรู้ว่าใครparentเป็น แต่ฉันต้องการที่จะคิดออกที่child1เป็น ฉันจะทำสิ่งนี้ได้อย่างไร มีเครื่องมือหลายอย่างที่ฉันจัดการ แต่ไม่มีใครสามารถบอกได้ว่ากระบวนการใดอยู่ที่ปลายอีกด้านของซ็อกเก็ต ฉันเหนื่อย: lsof -c progname lsof -c parent -c child1 ls -l /proc/$(pidof server)/fd cat /proc/net/unix โดยพื้นฐานแล้วฉันสามารถเห็นซ็อกเก็ตทั้งสองและทุกอย่างเกี่ยวกับพวกเขา แต่ไม่สามารถบอกได้ว่าพวกเขาเชื่อมต่อกัน ฉันพยายามระบุว่า FD ใดในผู้ปกครองกำลังสื่อสารกับกระบวนการลูก

1
ฉันจะตรวจสอบไฟล์ที่เปิดของกระบวนการแบบเรียลไทม์ได้อย่างไร
ฉันรู้ว่าฉันสามารถดูไฟล์ที่เปิดของกระบวนการที่ใช้lsof ในขณะนั้นในเครื่อง Linux ของฉัน อย่างไรก็ตามกระบวนการสามารถเปิดแก้ไขและปิดไฟล์ได้อย่างรวดเร็วจนฉันไม่สามารถมองเห็นได้เมื่อทำการตรวจสอบโดยใช้เชลล์สคริปต์มาตรฐาน (เช่นwatch) ตามที่อธิบายไว้ใน"การตรวจสอบไฟล์กระบวนการเปิดบน linux (เรียลไทม์)" . ดังนั้นฉันคิดว่าฉันกำลังมองหาวิธีง่ายๆในการตรวจสอบกระบวนการและดูว่ามันทำอะไรไปบ้างเมื่อเวลาผ่านไป มันจะดีถ้ามันเป็นไปได้ที่จะเห็นว่าการเชื่อมต่อเครือข่ายมัน (พยายามที่จะ) และให้เริ่มต้นการตรวจสอบก่อนที่กระบวนการจะมีเวลาในการทำงานโดยไม่ต้องเริ่มการตรวจสอบ เป็นการดีที่ฉันต้องการทำสิ่งนี้: sh $ audit-lsof /path/to/executable 4530.848254 OPEN read /etc/myconfig 4530.848260 OPEN write /var/log/mylog.log 4540.345986 OPEN read /home/gert/.ssh/id_rsa <-- suspicious 4540.650345 OPEN socket TCP ::1:34895 -> 1.2.3.4:80 | [...] 4541.023485 CLOSE /home/gert/.ssh/id_rsa <-- would have missed 4541.023485 …

2
ทำไมกระบวนการทดแทนจึงส่งผลให้ไฟล์ชื่อ / dev / fd / 63 ซึ่งเป็นไพพ์
ฉันพยายามเข้าใจไพพ์ที่มีชื่อในบริบทของตัวอย่างเฉพาะนี้ ฉันพิมพ์<(ls -l)เทอร์มินัลแล้วรับเอาต์พุตเป็น, bash: /dev/fd/63: Permission denied. ถ้าฉันพิมพ์cat <(ls -l)ฉันจะได้เห็นเนื้อหาไดเรกทอรี ถ้าฉันแทนที่catด้วยechoฉันคิดว่าฉันได้รับชื่อสถานี (หรือมันคืออะไร?) echo <(ls -l)/dev/fd/63ให้ออกเป็น นอกจากนี้ผลลัพธ์ตัวอย่างนี้ไม่ชัดเจนสำหรับฉัน ls -l <(echo "Whatever") lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752] อย่างไรก็ตามถ้าฉันให้ls -l <()มันจะแสดงเนื้อหาไดเรกทอรี เกิดอะไรขึ้นในกรณีของไปป์ที่ระบุชื่อ?

2
หมายเลขลิงก์ / proc / PID / fd / X
ใน Linux /proc/PID/fd/Xลิงก์สำหรับตัวอธิบายไฟล์ที่เป็นไพพ์หรือซ็อกเก็ตจะมีตัวเลขเช่น: l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839] l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839] lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925] lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926] lr-x------ 1 user …

3
ฉันจะบอกสคริปต์เพื่อรอให้กระบวนการเริ่มยอมรับการร้องขอบนพอร์ตได้อย่างไร
ฉันต้องการคำสั่งที่จะรอให้กระบวนการเริ่มยอมรับการร้องขอบนพอร์ตเฉพาะ มีอะไรใน linux หรือเปล่า? while (checkAlive -host localhost -port 13000 == false) do some waiting ...

3
ฉันจะ“ แมวและติดตาม” ไฟล์ได้อย่างไร
wgetไฟล์จะถูกดาวน์โหลดตามลำดับโดย หากฉันเริ่มเปิดออกด้วยcat myfile.tar.bz2 | tar -xjอาจเป็นแกะอย่างถูกต้องหรือล้มเหลวด้วย "ไม่คาดคิด EOF" ขึ้นอยู่กับสิ่งที่เร็วขึ้น วิธี "cat และ follow" ไฟล์เช่นเนื้อหาที่ส่งออกของไฟล์ไปยัง stdout แต่ไม่ออกจาก EOF ให้หม่อม subribed ไปที่ไฟล์นั้นและทำการส่งออกส่วนใหม่ของข้อมูลออกต่อเมื่อปิดไฟล์โดย ผู้เขียนและไม่เปิดใหม่ภายใน N วินาที ฉันได้สร้างสคริปต์cat_and_followตามคำตอบของ @ arielCo ซึ่งจะยุติtailเมื่อไฟล์ไม่ถูกเปิดเพื่อการเขียนอีกต่อไป
31 files  pipe  cat  tail  open-files 

2
การย้ายไฟล์ที่ถูกผนวกเข้านั้นปลอดภัยหรือไม่?
ฉันมีกระบวนการ Node.js ที่ใช้ในการเพิ่มสายที่จะfs.appendFile file.logเฉพาะสายที่สมบูรณ์ประมาณ 40 ตัวอักษรต่อบรรทัดถูกผนวกสายเช่นเป็นเหมือนfs.appendFile("start-end")ไม่เหมือน 2 สายและfs.appendFile("start-") fs.appendFile("end")หากฉันย้ายไฟล์นี้ไปfile2.logฉันจะแน่ใจได้หรือไม่ว่าไม่มีเส้นใดที่สูญหายหรือคัดลอกบางส่วน?

6
วิธีที่ดีที่สุดในการเพิ่มพื้นที่ว่างในดิสก์จากไฟล์ที่ถูกลบซึ่งเปิดค้างไว้
สวัสดีฉันมีหลายไฟล์ที่ถูกลบ แต่ด้วยเหตุผลบางประการพื้นที่ดิสก์ที่เกี่ยวข้องกับไฟล์ที่ถูกลบไม่สามารถใช้งานได้จนกว่าฉันจะฆ่ากระบวนการสำหรับไฟล์ที่สละพื้นที่ดิสก์อย่างชัดเจน $ lsof /tmp/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME cron 1623 root 5u REG 0,21 0 395919638 /tmp/tmpfPagTZ4 (deleted) พื้นที่ดิสก์ที่ถ่ายโดยไฟล์ที่ถูกลบด้านบนทำให้เกิดปัญหาเช่นเมื่อพยายามใช้ปุ่มแท็บเพื่อเติมข้อความในเส้นทางของไฟล์โดยอัตโนมัติฉันได้รับข้อผิดพลาด bash: cannot create temp file for here-document: No space left on device แต่หลังจากฉันเรียกใช้kill -9 1623พื้นที่สำหรับ PID นั้นได้รับการปลดปล่อยและฉันไม่ได้รับข้อผิดพลาดอีกต่อไป คำถามของฉันคือ: เหตุใดพื้นที่นี้จึงไม่ว่างทันทีเมื่อลบไฟล์ครั้งแรก วิธีที่ดีที่สุดในการเรียกคืนพื้นที่ไฟล์ที่เกี่ยวข้องกับไฟล์ที่ถูกลบคืออะไร? และโปรดแจ้งให้เราทราบคำศัพท์ที่ไม่ถูกต้องที่ฉันใช้หรือข้อมูลอื่น ๆ ที่เกี่ยวข้องและเกี่ยวข้องกับสถานการณ์นี้

3
เราจะรู้ได้อย่างไรว่าใครอยู่ที่ปลายอีกด้านของอุปกรณ์ปลายทางหลอก?
ถ้าฉันทำ: echo foo > /dev/pts/12 บางกระบวนการจะอ่านสิ่งนั้นfoo\nจากตัวให้คำอธิบายไฟล์ไปยังด้านต้นแบบ มีวิธีที่จะค้นหาว่ากระบวนการ (เหล่านั้น) คืออะไร? หรือในคำอื่น ๆ ฉันจะรู้ได้อย่างไรว่า xterm / sshd / script / screen / tmux / expect / socat ... อยู่ที่ปลายด้านหนึ่งของ/dev/pts/12? lsof /dev/ptmxจะบอกกระบวนการที่มีตัวอธิบายไฟล์ที่ด้านหลักของ pty ใด ๆ กระบวนการสามารถใช้ptsname()( TIOCGPTNioctl) เพื่อค้นหาอุปกรณ์ทาสตาม fd ของตัวเองไปยังด้านต้นแบบดังนั้นฉันสามารถใช้: gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)" สำหรับแต่ละ pid / fd ที่ส่งกลับโดยlsofสร้างการแมปนั้น แต่มีวิธีที่เชื่อถือได้และน่ารำคาญน้อยกว่าในการรับข้อมูลนั้นหรือไม่

2
จะหาไฟล์ออฟเซ็ตของไฟล์ที่เปิดอยู่ได้อย่างไร?
ปัญหาของฉันคือเมื่อ lsof -p pid ฉันสามารถค้นหารายการของไฟล์ที่เปิดของกระบวนการที่ id กระบวนการเป็น pid แต่มีวิธีหาออฟเซ็ตไฟล์ของไฟล์ที่เข้าถึงแต่ละไฟล์หรือไม่? กรุณาให้คำแนะนำกับฉัน?
26 linux  open-files 

4
fd เดียวกันในกระบวนการต่าง ๆ สามารถชี้ไปที่ไฟล์เดียวกันได้อย่างไร?
ว่าฉันมีขั้นตอนที่ 1และขั้นตอนที่ 2 ทั้งสองมีตัวอธิบายไฟล์ที่สอดคล้องกับจำนวนเต็ม 4 ในแต่ละกระบวนการอย่างไรก็ตามไฟล์ descriptor 4 ชี้ไปที่ไฟล์ต่างกันโดยสิ้นเชิงใน Open File Table ของเคอร์เนล: เป็นไปได้อย่างไร? ไฟล์ descriptor ไม่ควรเป็นดัชนีไปยังระเบียนใน Open File Table หรือไม่

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