Tôi nên ghi thư mục nào cho các tệp trung gian của mình, dưới dạng dev?


17

Tôi đang bắt đầu viết một vài tập lệnh bash cho dự án của mình và chúng cần một số tệp hoặc biến trung gian được viết.

Tôi muốn biết những thư mục nào tôi có thể chắc chắn có quyền truy cập khi ai đó chạy tập lệnh của tôi? Nó có phải là một thực tế phổ biến để sử dụng /tmp/? Hay tôi nên sử dụng cái gì khác?

Câu trả lời:


21

Tôi thấy tài liệu Tiêu chuẩn phân cấp hệ thống tập tin là vô giá khi tìm kiếm công cụ này.

Có một vài lựa chọn,

  • / tmp - tệp tạm thời 'không cố định'
  • / var / tmp - tệp tạm thời 'vĩnh viễn'
  • / var / cache - tệp dữ liệu tạm thời của 'ứng dụng'

Nó thực sự phụ thuộc vào loại dữ liệu bạn đang lưu trữ.


sử dụng tốt hơn những gì người dùng / môi trường mang lại cho bạn và chỉ sử dụng / tmp, v.v. làm dự phòng. (những gì unix.stackexchange.com/a/79776/7784 đã nói)
Oluf Lorenzen

15

Nếu bạn cần ghi một số tệp tạm thời chỉ tồn tại chừng nào tập lệnh hoặc ứng dụng của bạn đang chạy, hãy sử dụng thư mục được chỉ định bởi TMPDIRbiến môi trường hoặc nếu biến đó không được xác định , /tmp.

/tmpbị xóa khi khởi động trên một số hệ thống (đôi khi ngay cả trong RAM, ví dụ như mặc định trên Solaris và trên một số cài đặt Linux), do đó, nó không thể được sử dụng cho các tệp phải tồn tại khi mất điện hoặc khởi động lại. /var/tmpcó thể được sử dụng cho các tệp phải tồn tại khi khởi động lại, nhưng thỉnh thoảng có thể được quản trị viên hệ thống xóa sạch. Nếu ứng dụng của bạn cần lưu tệp trên cơ sở vĩnh viễn, hãy viết chúng ở đâu đó trong thư mục chính của người dùng (trong ~/.programmingnoobsapphoặc ~/.cache/programmingnoobsapp) hoặc dưới /var/lib/programmingnoobsapphoặc /var/cache/programmingnoobsapp.

Lưu ý rằng /tmpđược chia sẻ giữa tất cả người dùng, vì vậy bạn cần có biện pháp phòng ngừa khi tạo tệp ở đó. Bạn cần chọn một tên tệp chưa tồn tại và bạn cần cẩn thận không cho phép điều kiện cuộc đua trong đó một quy trình khác tạo tệp trước bạn với các quyền khác nhau, có thể là lỗ hổng bảo mật (nếu quy trình khác đang chạy như một người dùng khác, sau đó nó có thể truy cập và sửa đổi dữ liệu của quy trình của bạn). Sử dụng mktemplệnh để tạo một tập tin trong /tmphoặc /var/tmp. Theo mặc định, mktemptạo một tệp trong $TMPDIRhoặc /tmpnếu TMPDIRkhông được đặt, thường là đúng nơi. Nếu bạn cần sử dụng nhiều tệp tạm thời hoặc thậm chí nếu bạn cần một tệp duy nhất, tôi khuyên bạn nên tạo một thư mục cho tất cả các tệp tạm thời của mình vớimktemp -d và loại bỏ nó ở cuối tập lệnh của bạn.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

wrt to mktemp, tôi không xóa các tập tin tạm thời ở cuối tập lệnh của tôi. Tôi có một công việc cron tmpwatch tự động loại bỏ các tập tin cũ. Trong phần lớn các trường hợp, tôi không đọc tệp trung gian và hệ thống sẽ tự xóa các tệp. Tuy nhiên, nếu có vấn đề xảy ra với tập lệnh, tôi có tất cả các tệp trung gian để dễ gỡ lỗi.
emory

1
+1 cho mktemp. Đối với tôi đây là câu trả lời đúng: ủy thác nhiệm vụ tạo tệp tạm thời một cách an toàn mktemp(xem bài viết này ). Mặc dù một câu trả lời trích dẫn FHScũng có giá trị lớn.
Carlos Campderrós

Tại sao bạn khởi tạo tmp_roottrước khi gán nó? Nó sẽ không tự nhiên hơn với unsetnó?
l0b0

@ l0b0 Hoặc là sẽ hoạt động (ngoại trừ set -u, nhưng điều đó không phổ biến). Nó cần phải (un) được đặt thành giá trị an toàn trước khi đặt bẫy, trong trường hợp tập lệnh bị giết ngay sau khi đặt bẫy.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã thêm set -o errexitđể nếu tmp_rootđã được đặt ở chế độ chỉ đọc trong môi trường thì nó sẽ không phá hủy thư mục sai ...
l0b0

2

Chỉ để bổ sung cho các câu trả lời đã được đăng cho đến nay.

Ngoài ra còn có /dev/shmmột số bản phân phối Linux có thể được sử dụng để lưu trữ tạm thời. Lưu trữ này chỉ nên được sử dụng khi hiệu năng của tệp I / O là một yếu tố quan trọng được đưa /dev/shmra sử dụng tmpfshệ thống tệp. Ngoài ra, nó nên được sử dụng cho các tập tin và dữ liệu có kích thước hợp lý. Hệ tmpfsthống tập tin sử dụng RAM hệ thống làm bộ lưu trữ để nó không liên tục từ khởi động đến khởi động.

Có một tổng quan tốt về tất cả các lựa chọn được đề cập ở đây trên StackOverflow cũng như trong Hỏi & Đáp này có tiêu đề: / tmp vs. / dev / shm để lưu trữ tệp tạm thời trên Linux? . Nó được đề cập tốt trong Hỏi & Đáp SuperUser này có tiêu đề: Khi nào tôi nên sử dụng / dev / shm / và khi nào tôi nên sử dụng / tmp? .

Người giới thiệu


0

Có, /tmpchủ yếu là cho các tập tin được yêu cầu tạm thời. / Tmp có bit dính trên đó chỉ có nghĩa là chủ sở hữu của mục, chủ sở hữu của thư mục hoặc siêu người dùng có thể đổi tên hoặc xóa các tệp. nhiều chương trình sử dụng điều này để tạo tập tin khóa và lưu trữ dữ liệu tạm thời. Trên một số phân phối, thư mục này bị xóa khi khởi động hoặc tắt máy.


1
Không phải tất cả các thư mục / tmp đều bị xóa khi khởi động. Ví dụ: cài đặt AIX mặc định không (và đây là UNIX & Linux, không chỉ Linux).
EightBitTony

Tuy nhiên, nếu nó là "bộ nhớ" cư trú, dường như được mặc định trong rất nhiều trường hợp, nó sẽ biến mất khi hệ thống dừng lại vì bất kỳ lý do nào.
mdpc
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.