/ tmp có đảm bảo tồn tại không?


42

Tôi có cần kiểm tra & tạo /tmptrước khi ghi vào một tệp bên trong nó không? Giả sử rằng không có ai chạy sudo rm -rf /tmpvì đó là trường hợp rất hiếm


16
"Bảo đảm" nghĩa là gì? FHS yêu cầu nó, vì vậy bất kỳ bản phân phối tuân thủ FHS nào cũng sẽ có nó. Tuy nhiên, có nhiều phân phối mục đích đặc biệt không tuân thủ FHS. Chắc chắn có thể tạo một bản phân phối Unix / Linux mà không có / tmp, nhưng bạn có cần quan tâm đến điều đó hay không hoàn toàn phụ thuộc vào việc bạn có quan tâm đến việc hỗ trợ các hệ thống đó hay không.
Lie Ryan

1
Tại sao không tạo thư mục tạm thời của riêng bạn và xóa nó khi bạn hoàn thành với nó thay vì dựa vào lần khởi động lại tiếp theo để dọn dẹp?
WGroleau

4
@WGroleau Tôi không biết về OP, nhưng trên các tập lệnh tôi viết cho hệ thống của riêng tôi, tôi thường đặt các tệp tạm thời trong thư mục con của /tmp(được tạo bằng mktemp) sau đó xóa thư mục con đó khi thoát. Hầu hết hệ thống của tôi được gắn ở chế độ chỉ đọc và điều này giúp tôi không phải nhớ cdđến một thư mục có thể ghi
Fox

1
@WGroleau Tôi không dựa vào việc khởi động lại để dọn sạch nó. những mktempvẻ thực sự tuyệt vời, I'l lẽ chấm dứt sử dụng đó.
Ayush

7
@jamesqf Vâng, không cần phải khởi động lại để xóa /tmp. Tuy nhiên, ngược lại, nó được phép làm như vậy, và có lẽ WGroleau đã ngoại suy quá xa từ đó. My /tmplà một tmpfsbộ nhớ RAM, vì vậy nó sẽ bị xóa khi tắt máy. Tuy nhiên, đó chỉ là một chi tiết của hệ thống, không được FHS đảm bảo. Vì vậy, với nhận xét ban đầu, thật tuyệt vời khi dựa vào sự hiện diện hay vắng mặt của bất cứ thứ gì ở /tmpgiữa đôi bốt.
underscore_d

Câu trả lời:


60

Các đảm bảo VSATTP nhiệm vụ mà /tmptồn tại, cũng như POSIX vì vậy bạn có thể dựa vào việc nó có (ít nhất là trên các hệ thống phù hợp, nhưng thực sự nó khá nhiều đảm bảo sẽ có mặt trên Unix-like hệ thống). Nhưng bạn không nên: quản trị viên hệ thống hoặc người dùng có thể thích các vị trí khác cho các tệp tạm thời. Xem Tìm kiếm tmp dir chính xác trên nhiều nền tảng để biết thêm chi tiết.


Tất nhiên đây là một thất bại trong thiết kế. /tmplà một cái tên $TMPDIRlà một tên khác. Nếu bạn không thể tin vào /tmpviệc trở thành tên đúng của thư mục tạm thời, tại sao bạn có thể tin tưởng $TMPDIRlà tên của biến môi trường đúng? Tại sao tôi không nên kiểm tra $TMPDIRVARđể có được tên của biến đó ? Một mức độ gián tiếp là đủ, và /tmpchính xác là như vậy. Nó không nói bất cứ điều gì về lưu trữ thực tế, nó chỉ là một cái tên.
MSalters

@MSalters có nhiều hơn một chút so với nó. Trước các không gian tên, $TMPDIRcho phép mỗi người dùng có một thư mục tạm thời riêng biệt hoặc thậm chí sử dụng các thư mục tạm thời khác nhau cho các chương trình khác nhau; một /tmpkhông cung cấp điều đó (một lần nữa, không có không gian tên hoặc một cái gì đó tương tự). Cũng có rất nhiều lịch sử (hoặc di sản) cần tính đến.
Stephen Kitt

Mỗi người dùng là một điểm hợp lệ, nhưng đó là lý do tại sao một thiết kế tốt sẽ sử dụng ~/tmpcho điều đó. Tất nhiên có thể vẫn là vị trí vật lý như /tmp, tất nhiên.
MSalters

44

Trong thực tế, /tmplà khá nhiều đảm bảo để tồn tại. Tuy nhiên, ngay cả khi nó tồn tại, điều đó không có nghĩa là bạn nên đặt các tệp tạm thời ở đó.

Quy ước tiêu chuẩn là sử dụng TMPDIRbiến môi trường. Nếu nó tồn tại, nó trỏ đến một thư mục cho các tập tin tạm thời. Nếu nó không tồn tại, đặt các tập tin tạm thời vào /tmp.

Trong tập lệnh shell, bạn có thể sử dụng "${TMPDIR:-/tmp}"làm vị trí tệp tạm thời: điều này mở rộng thành giá trị TMPDIRnếu nó được đặt và /tmpngược lại. Hoặc bạn có thể đặt TMPDIRđiều kiện trong trường hợp nó không được đặt, bằng lệnh

: "${TMPDIR:=/tmp}"

và sau đó tạo các tập tin tạm thời bên trong "$TMPDIR".

Lưu ý rằng bất kỳ ứng dụng nào cũng có thể tạo tập tin theo /tmphoặc $TMPDIR. Hơn nữa, thư mục này có thể được chia sẻ giữa những người dùng, vì vậy bạn cần quan tâm đến các quyền khi tạo tệp. Nhiều hệ thống (Linux, * BSD) có lệnh mktemptạo tệp an toàn trong thư mục bên phải. Nói chung, nên sử dụng mktempđể tạo các tệp và thư mục tạm thời - đặc biệt là từ tập lệnh shell, trong đó không thể tạo tệp một cách an toàn trong thư mục dùng chung do khả năng bị tấn công symlink ( mkdirtốt nếu bạn xử lý lỗi chính xác).

¹ và không trống - nếu biến trống thì dù sao cũng không thể sử dụng được và nói chung nên xử lý các biến rỗng hoặc không đặt theo cùng một cách nếu chúng được cho là chứa tên tệp.


11
Có lẽ bạn có thể đề cập rằng người dùng phải mong đợi sự va chạm tên tệp. Vì vậy, IMO cách duy nhất được đề xuất để tạo tệp trong / tmp là lệnh mktempvà điều này cũng sẽ tự động xử lý $ TMPDIR ".
rudimeier

Đây là câu trả lời bạn muốn. Tôi đã thấy các hệ thống không có / bin hãy để một mình / tmp.
Joshua

1
Ngoài ra A.10 Cấu trúc thư mục và thiết bị nêu: ... Thư mục /tmpđược giữ lại trong POSIX.1-2008 để phù hợp với các ứng dụng lịch sử giả định tính khả dụng của nó. Việc triển khai được khuyến khích để cung cấp tên thư mục phù hợp trong biến môi trường TMPDIRvà các ứng dụng được khuyến khích sử dụng nội dung TMPDIRđể tạo tệp tạm thời. ...
Andrew Henle

3
Thật buồn khi thấy rằng mktempnó không có trong POSIX, mặc dù nó đã có trong hầu hết các hệ điều hành phổ biến như GNU (Linux) , OpenBSD , FreeBSDmacOS .
Franklin Yu

1
Có thể đáng để thêm rằng các mktempchức năng giống như có sẵn trong nhiều ngôn ngữ lập trình và kịch bản, chẳng hạn như libc , PerlPython .
Gaurav

6

Mặc dù nó rất có khả năng tồn tại, bạn nên kiểm tra một lý do khác: nó không được đảm bảo là lớn . Trên nhiều hệ thống, /tmpđược hỗ trợ bởi RAM chứ không phải đĩa và có thể bị giới hạn ở một vài GB. (Trên các hệ thống Fedora, mặc định là một nửa RAM.) Vì vậy, bạn nên kiểm tra không chỉ sự tồn tại mà còn có thể đặt bất cứ thứ gì bạn định đặt vào đó không.

Nếu bạn có một cái gì đó lớn, sử dụng /var/tmp/.


2
Tôi không chắc liệu đó có phải là "cách Unix" để kiểm tra không gian có sẵn trước khi tiếp tục hay không, đặc biệt là vì không phải lúc nào cũng biết chính xác bạn sẽ cần bao nhiêu dung lượng. Trong mọi trường hợp, bạn phải chuẩn bị để xử lý lỗi ghi một cách duyên dáng trong trường hợp hệ thống tập tin sẽ đầy; và nếu bạn sẽ làm điều đó, những gì đạt được bằng cách kiểm tra trước sẽ dễ bị phủ định sai và tích cực?
Nate Eldredge

2
Tôi phụ thuộc vào cách duyên dáng bạn có thể xử lý trường hợp thất bại, tôi đoán. Điểm chính là không cho rằng /tmpcó thể xử lý các tệp lớn. Giả sử đó là tải xuống 10 GB qua liên kết tốc độ vừa phải. "Cách Unix" hay không, thật là khổ sở khi phát hiện ra vài giờ rằng nó sẽ không hoạt động.
mattdm

1
@mattdm Kiểm tra sớm là tốt nhưng thất bại phải được xử lý. Có thể / tmp có sẵn 10 GB khi quá trình tải xuống bắt đầu nhưng Người dùng khác sao chép 5 GB vào đó trong khi quá trình tải xuống của bạn đang chạy. Giờ thì sao? Heh.
Zan Lynx

Chắc chắn rồi! Tôi không có ý này như một cái cớ để không xử lý thất bại.
mattdm

"Nếu bạn có một cái gì đó lớn" - sử dụng / tmp và để hệ điều hành trao đổi nếu cần.
UKMonkey
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.