ป้องกันไม่ให้ไดเรกทอรีใน / tmp ถูกลบ


10

ฉันมักจะใช้/tmpไดเรกทอรีบนเครื่อง Linux ของฉันเพื่อจัดเก็บไฟล์ชั่วคราว (เช่น PDF จากเว็บไซต์ที่ต้องการให้ฉันดาวน์โหลดก่อน ฯลฯ ) และฉันมักจะสร้างไดเรกทอรีด้วยชื่อผู้ใช้ของฉัน แต่ทุกครั้งที่เริ่มต้นระบบ (รวมถึงไฟล์ทั้งหมด) จะถูกลบ ตอนนี้ฉันรู้แล้วว่าฉันสามารถใส่มันลงไปได้/var/tmpแต่ฉันต้องการลบเนื้อหาทั้งหมด แต่สำหรับตัวไดเรกทอรีเอง ดังนั้น:

tmp
 |- me # this should stay
 |  |- foo1 # this should be deleted...
 |  |- bar1 # ...and this as well
 |- other stuff...

มีวิธีการทำเช่นนี้? อาจจะมีสิทธิ์หรือมีการกำหนดค่าพิเศษหรือไม่?


1
คุณสามารถใส่รหัสลงในไฟล์เข้าสู่ระบบของเชลล์เพื่อ "ทดสอบ & mkdir" ตามต้องการ
Jeff Schaller

3
/tmpน่าจะเป็นtmpfsระบบไฟล์ ไฟล์เหล่านั้นไม่ถูกลบจริงๆ พวกเขาถูกเก็บไว้ใน RAM และหายไปเมื่อรีบูต นั่นเป็นเหตุผลที่คุณได้รับคำตอบที่ต้มลงไป "สร้างใหม่อีกครั้งมันในการบูตหรือเข้าสู่ระบบ"
MSalters

คำตอบ:


4

ทางออกหนึ่งคือการใช้@rebootงาน cron:

@reboot mkdir -p "/tmp/$USER"

การเพิ่มสิ่งนี้ลงใน crontab ของคุณด้วยcrontab -eจะทำให้มันทำงานเมื่อใดก็ตามที่เครื่องบู๊ต

หรือใช้

mkdir -p "/tmp/$USER"

ในไฟล์เริ่มต้นของเชลล์

ไม่ว่าในกรณีใดคุณอาจต้องการใช้

TMPDIR=/tmp/$USER
export TMPDIR

ในไฟล์เริ่มต้นของเชลล์หากคุณต้องการใช้ไดเรกทอรีนั้นเป็นไดเรกทอรีชั่วคราวเริ่มต้น


a) สร้างไดเรกทอรีสำหรับผู้ใช้ทั้งหมดหรือไม่และ b) ทริกเกอร์จากการเริ่มต้น 'เย็น' ด้วยหรือไม่
Linux4win

1
@ Linux4win คำตอบนี้ตอบสนองความต้องการของผู้ใช้คนเดียวเพราะนี่คือวิธีที่คุณใช้คำถาม ไม่สำคัญว่าเครื่องจะทำการบูทอย่างไร (ร้อนเย็นหรืออุ่น) แต่มันจะไม่ทำงานเมื่อกลับมาทำงานจากโหมดไฮเบอร์เนต (เพราะไม่ได้บูท)
Kusalananda

ด้วยเหตุผลบางอย่างการเพิ่ม@reboot mkdir -p "/tmp/$USER"ไปยังจุดสิ้นสุดของ crontab ไม่ได้ทำอะไรเลยในขณะที่การเรียกใช้mkdir -p "/tmp/$USER"สร้างไดเรกทอรี คนที่สองไม่ทำงานสำหรับฉันโดยวิธีการเพราะผมจำเป็นต้องเข้าถึงของฉัน/tmpผ่านโปรแกรมอื่น ๆ และยิงขึ้นทุกครั้งที่เปลือกเป็นที่น่ารำคาญนะ ...
Linux4win

@ Linux4win @rebootงาน cron ไม่ได้สร้างไดเรกทอรีหรือไม่? คุณได้รับอีเมลใด ๆ ที่ส่งถึงบัญชีของคุณพร้อมกับข้อความแสดงข้อผิดพลาดจาก cron daemon หรือไม่?
Kusalananda

ดีไม่ ... อาจเป็นเพราะฉันยังไม่ได้กำหนดค่าmail? หรือว่าไม่จำเป็น?
Linux4win

14

ฉันใช้pam-tmpdirสิ่งนี้: มันสร้างไดเรกทอรีชั่วคราวผู้ใช้ส่วนตัวเมื่อเข้าสู่ระบบ หากต้องการตั้งค่าเพิ่ม

session optional pam_tmpdir.so

เพื่อบริการ PAM ที่เหมาะสม บนระบบที่ใช้เดเบียนการติดตั้งlibpam-tmpdirแพคเกจจะเสนอให้คุณทำเช่นนี้หรือคุณสามารถเพิ่มบรรทัดลงไป/etc/pam.d/common-sessionได้ ครั้งต่อไปที่คุณลงชื่อเข้าใช้คุณจะพบไดเรกทอรีภายใต้/tmp/userID ผู้ใช้ของคุณTMPและTMPDIRตั้งค่าอย่างเหมาะสม


7
คุณสามารถอธิบายได้ว่าบริการ PAM ที่เหมาะสมคืออะไรและสามารถเพิ่มบรรทัดเหล่านั้นได้อย่างไร ไฟล์ใดที่ควรแก้ไข
terdon

2

หากคุณไม่มีระบบที่ใช้ systemd และใช้ systemd-tmpfiles เพื่อจัดการการล้างข้อมูลคุณควรกำหนดค่าไดเรกทอรีโดยใช้ระบบนั้น

นี่เป็นเอกสารฉบับเต็ม คุณมีแนวโน้มที่จะสามารถบรรลุสิ่งที่คุณต้องการด้วยการสร้าง/etc/tmpfiles.d/something.confเนื้อหาเช่น:

d     /tmp/your_username   0750 your_user your_group  - -

1

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

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

find $HOME/tmp -depth -mtime +30 -print0 | xargs -0 -r rm -rf

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


mkdir a a/b; touch a/b/c. รอจนกระทั่ง 30 วันของคุณหมดอายุ เมื่อคุณลบcมันจะอัปเดตbซึ่งหมายความว่าต้องรออีก 30 วัน ในทำนองเดียวกันกับเมื่อคุณลบa bประการที่สองถ้าคุณสร้างไฟล์ในbแต่ไม่ได้สัมผัสaเป็นเวลา 30 วันที่aไดเรกทอรีจะได้รับการตีและเช็ดออกไฟล์ล่าสุดของคุณภายใต้rm -rf b
roaima

find "$HOME"/tmp -mtime +30 -type f -delete; find "$HOME/tmp" -depth -mmin +60 -type d -exec rmdir {} + 2>/dev/nullทำงานให้ฉัน
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.