Làm cách nào để ngăn thư mục bên trong / tmp bị xóa?


12

Câu hỏi này là về Ubuntu 14.10 trên máy tính xách tay dành cho nhà phát triển của tôi.

Tôi đã có một thư mục trong /tmpđó được một ứng dụng sử dụng để đặt những thứ tạm thời vào đó. Ứng dụng này thường tạo một thư mục tạm thời trong homedir của tôi và xóa nó sau đó. Vì một số lý do không hoạt động khi homedir được mã hóa. Vì vậy, thay vào đó, tôi đã tạo một liên kết tượng trưng cho /tmp/foobên trong homedir của mình. Ứng dụng của tôi có thể viết ở đó và làm cho nó trở thành thư mục con tạm thời.

Bây giờ /tmp/foobị xóa mỗi khi tôi khởi động lại máy. Cho đến bây giờ tôi mới tạo lại thư mục thủ công sau khi khởi động lại. Bây giờ tôi đã học trong thư mục / tmp được dọn sạch như thế nào? rằng có một công việc làm điều đó.

Tôi đã xem /etc/init/mounted-tmp.confnhưng bashfu của tôi và đặc biệt là findfu của tôi không đủ để làm những gì tôi muốn. Đây là một đoạn trích từ tập tin đó:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

Những gì tôi muốn làm là thêm một điều kiện làm cho nó xóa mọi thứ bên trong /tmp/foo, nhưng không phải là /tmp/foochính nó. Làm thế nào để làm điều đó?


/tmp/foomột thư mục hoặc một tập tin?
terdon

Một thư mục. Có tập tin bên trong.
simbabque

Tại sao không thêm mkdir /tmp/foongay trước đó end script?
Hagen von Eitzen

Chỉ cần FYI (bạn có thể đã biết điều này): 14.10 đạt EOL vào tháng 7 năm 2015, vì vậy bạn nên thực sự nâng cấp lên Vivid càng sớm càng tốt.
Léo Lam

Câu trả lời:


20

/etc/init/mounted-tmp.conflà một phần của mountallgói, vì vậy mọi cập nhật trên gói đó và các thay đổi được đề xuất sẽ được hoàn nguyên.

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

Thay vào đó, theo tiêu chuẩn Filesier Hierachy (FHS) ;

Về / tmp :

Các chương trình không được cho rằng bất kỳ tệp hoặc thư mục nào trong / tmp đều được giữ nguyên giữa các lệnh của chương trình.

Về / var / tmp :

Thư mục / var / tmp được cung cấp cho các chương trình yêu cầu các tệp hoặc thư mục tạm thời được bảo tồn giữa các lần khởi động lại hệ thống. Do đó, dữ liệu được lưu trữ trong / var / tmp liên tục hơn dữ liệu trong / tmp.

Vì vậy, bạn nên thay đổi liên kết tượng trưng của bạn để sử dụng /var/tmpthay vì /tmp.


3
Ví dụ cổ điển khi bạn có một cái búa, mọi thứ trông giống như một cái đinh.
WernerCD

@WernerCD bạn có thể giải thích ý của bạn là gì không? Bạn đang nói rằng đó /var/tmpkhông phải là một ý tưởng tốt?
simbabque

6
Khi tất cả những gì bạn có là một cái búa ... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.Tôi đang nói rằng OP đang sử dụng / tmp cho một thứ gì đó không có nghĩa là được sử dụng cho - Sử dụng / tmp như một cái búa cho vấn đề giữ tmp-but-not-khá -tmp thứ. / var / tmp là MEANT được giữ giữa các lần khởi động lại, vì vậy đây là câu trả lời đúng.
WernerCD

8

Không hoàn toàn là một câu trả lời cho câu hỏi của bạn, nhưng bạn có thể thấy đó /var/tmplà một địa điểm phù hợp hơn, vì nó không được làm sạch trong quá trình khởi động lại. Nó được thiết kế cho các tệp tạm thời không nên tự động bị loại bỏ sau một thời gian ngắn.

Tuy nhiên, những gì tôi thường làm là tạo cho mình một thư mục trong / opt để lưu trữ những thứ ngẫu nhiên tôi không muốn ở nhà. Đó là một nơi thích hợp để đặt những thứ nằm ngoài tầm kiểm soát của hệ điều hành chính.


Đây là ý tưởng đúng. Nếu / tmp không làm những gì bạn muốn, thì hãy lưu trữ thông tin của bạn ở một nơi khác - ngay cả trên một ổ đĩa khác nếu có dung lượng trống. Đừng lộn xộn với những thứ mà Linux (và các lập trình viên khác) mong đợi là một cách nhất định trừ khi đó là cách duy nhất để có được kết quả bạn cần.
Joe

6

Thích như vậy:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

Thí dụ:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

Tôi đồng ý với người dùng aap: Bạn nên quan tâm đến điều này trong phần mềm được sử dụng bằng cách tạo lại thư mục ở đó nếu chúng là tệp tmp hoặc sử dụng thư mục khác nếu chúng không phải là tệp tmp không bị xóa.


Điều này không thực sự hoạt động. Mặc dù findlệnh hoạt động như mong đợi khi chạy thủ công, thư mục vẫn bị xóa sau khi chỉnh sửa /etc/init/mounted-tmp.conf. Có vẻ như có điều gì khác đang diễn ra ở đây.
terdon

thứ ehm điều đó có nghĩa là dòng thứ 1 bị lỗi có lẽ nó cần phải tương đối (?)
Rinzwind

@terdon vâng, có vẻ như nó cần phải liên quan đến / tmp /
Rinzwind

Tôi không nghĩ vậy, tôi đã thử nhiều hoán vị khác nhau, bao gồm -path ./foovà thậm chí -name '*foo*'và không ai trong số chúng hoạt động (trên Ubuntu Server 14.04). Tôi nghĩ rằng đó không phải là tập tin đúng và chúng tôi đang tìm sai chỗ. Những gì bạn đang đề xuất nên hoạt động, nó dường như không.
terdon

0

Một ý tưởng tồi là có các tệp có giá trị trong tương lai, ghi vào thư mục / tmp (/ var / tmp, theo đề xuất của người khác, là một nơi tốt hơn). Điều đó nói rằng, bạn có thể muốn đưa ra một cú đánh vào chattr. Điều này nên được chạy sau khi ứng dụng thoát, nhưng trước khi tắt máy. Hãy nhớ rằng thao tác này sẽ không cho phép bất cứ điều gì ghi vào thư mục đó kể từ đó.

chạm /tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me


Làm thế nào điều đó sẽ hữu ích nếu tôi muốn có một thư mục tạm thời?
simbabque

-1

Chạy cái này:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

sau đó Thêm cái này vào / etc / inittab xem tại đây: tập tin inittab ở đâu? :

foo:2345:boot:/bin/foodel

Điều đó sẽ tạo / etc / foo khi khởi động nếu nó không tồn tại, và sau đó làm trống nó.

Điều này sẽ làm tương tự khi đăng nhập bash:

echo "/bin/foodel" >> ~/.bashrc

Ubuntu phiên bản 14 không sử dụng /etc/inittab. Điều này được nêu rõ ràng và dứt khoát trên trang hướng dẫn của nó.
JdeBP

* facepalm * Xin lỗi @JdeBP, đây là những gì xảy ra với tôi sau khi tung ra 4 phiên bản linux khác nhau. Anh ta có thể đặt mã ở đâu đó đã nêu yêu cầu Ubuntu.com/questions 432308/where
Daniel
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.