Tôi nên đặt bộ đệm ứng dụng của mình cho các ứng dụng dựa trên Unix ở đâu?


10

Tôi đang xây dựng ứng dụng dòng lệnh và tôi có nhu cầu lưu một số dữ liệu tạm thời vào các tệp. Tôi không biết đâu là quy ước cho các ứng dụng lưu trữ bộ nhớ cache của chúng trên các hệ thống dựa trên unix (trong trường hợp này là Ubuntu 12.0.4)?

Câu trả lời:


12

"Các hệ thống dựa trên Unix" là một phạm trù quá chung chung để đưa ra bất kỳ loại quyết định áp dụng chung nào sẽ áp dụng cho tất cả các hệ thống dựa trên Unix. Vấn đề là cấu trúc hệ thống tập tin (và vị trí "thông thường" / "thông thường" để đặt mọi thứ) rất khác nhau giữa các hương vị khác nhau của "Unix" (nếu bạn thậm chí có thể gọi nó là) mà bạn phải xử lý nó trên cơ sở từng trường hợp.

Một vài ví dụ:

  • Trên Ubuntu, các thư viện 64 bit đi vào / usr / lib hoặc / usr / lib / x86_64-linux / và thư viện 32 bit đi vào / usr / lib32
  • Trên Fedora, các thư viện 64 bit đi vào / usr / lib64 và các thư viện 32 bit đi vào / usr / lib
  • Fedora không còn khái niệm về / lib hoặc / bin nữa (chúng chỉ là các liên kết tượng trưng vào các thư mục / usr tương đương)
  • Hầu hết các bản phân phối Linux thích cài đặt phần mềm do người dùng cài đặt (nghĩa là phần mềm không được cung cấp bởi người quản lý gói) trong / usr / local / (với lib, bin, v.v., var, v.v. trong / usr / local /)
  • Nhiều bản phân phối Linux sử dụng / var / cache cho bộ đệm, mặc dù nếu nó "tạm thời" (không quan trọng nếu nó bị mất), nó có thể được lưu trữ trong / tmp
  • Một số ứng dụng loại "ứng dụng trong thư mục" lưu trữ mọi thứ trong thư mục con / opt (đặc biệt là trình cài đặt clickwrap)
  • Một số ứng dụng chỉ cần cài đặt vào thư mục con của thư mục ~ của người dùng (thường là / home / tên người dùng)
  • Trên Solaris, tôi đã thấy / srv được sử dụng tương tự như / opt hoặc đôi khi / srv là gốc www

Câu trả lời là quy ước được tích hợp tốt, được xã hội chấp nhận, tích hợp tốt để lưu trữ mọi thứ trên bất kỳ hệ điều hành nào, cho dù đó là bản phân phối của Linux, BSD, Solaris, HP-UX, v.v. phụ thuộc vào hoàn cảnh chính xác . Đặc biệt:

  • Gói được phân phối như thế nào?
  • Người dùng có yêu cầu quyền truy cập root để cài đặt nó không?
  • Gói có phụ thuộc hoặc tích hợp trực tiếp với các gói khác đã có trên hệ thống, ví dụ: plugin hoặc add-on không?
  • Là gói sẽ được tích hợp vào kho lưu trữ ngược dòng của bản phân phối, để người dùng có thể sử dụng một lệnh như apt-gethoặc yumđể cài đặt trực tiếp mà không cần tải xuống trình cài đặt từ một trang web?
  • Phần mềm sẽ có cấu hình riêng cho từng người dùng khác nhau vận hành máy tính?
  • Phần mềm có cài đặt cấu hình toàn cầu mà quản trị viên (root) chỉ có thể sửa đổi không?
  • Phần mềm có cần tích hợp với hệ thống init không (ví dụ: để bắt đầu khởi động)?

Không có câu trả lời thẳng cho điều này mà không xem xét tất cả các yếu tố. Tuy nhiên, đối với Ubuntu 12.04 cụ thể , nếu bạn đang xây dựng gói của mình thành một .debtệp sẽ được phân phối trong PPA hoặc để gửi tới người đăng ký gói riêng của Ubuntu ( mainhoặc universe), tôi khuyên bạn nên lưu trữ bộ đệm /var/cache. Nhưng điều đó chỉ dành cho Ubuntu và bạn chắc chắn không nên áp dụng giả định rằng mọi hệ điều hành distro hoặc Unix sẽ xem xét điều này có thể chấp nhận được.

Hơn nữa, nếu không có lợi thế nào trong việc lưu dữ liệu bộ đệm trên các khởi động của hệ thống, tôi nghĩ nó cũng có thể thuộc về / tmp.

Lưu ý rằng bạn sẽ gặp phải các vấn đề quy ước đường dẫn này cho mọi loại tệp mà chương trình của bạn sử dụng: dữ liệu được chia sẻ, tệp thực thi, thư viện, tệp trợ giúp, hình ảnh, âm thanh, trang web và bật và tắt. Vì vậy, tôi phải tự hỏi, nếu bạn đang hỏi về các tệp bộ đệm, làm thế nào bạn có kế hoạch xử lý các loại tệp khác. Bạn chỉ đang đưa ra những giả định ngây thơ và hy vọng rằng không ai không đồng ý với bạn? Nếu bạn chưa đọc bất kỳ tài liệu hoặc tiêu chuẩn Ubuntu nào đề xuất nơi đặt chúng, thì bạn chỉ nên giả định điều này hay điều khác. Ví dụ, luôn luôn gắn các thư viện trong / usr / lib có thể là một sai lầm, vì tùy thuộc vào tình huống chúng có thể thuộc về nơi khác.

Ngoài ra, là một nhà phát triển phần mềm, tôi nghĩ rằng điều có trách nhiệm nhất phải làm là cho phép người dùng cuối quyết định nơi đặt các tệp của họ. Bạn có thể đặt mặc định, nhưng người dùng (và nhà phân phối) có thể và sẽ tùy chỉnh bản dựng để phù hợp với bản phân phối của họ.

Cách dễ nhất để làm điều này là xây dựng chương trình của bạn bằng GNU Autoconf . Autoconf là một hệ thống xây dựng nơi người dùng có thể chuyển các đối số dòng lệnh cho tập lệnh xây dựng để thay đổi đường dẫn của các "loại thư mục" khác nhau khỏi các mặc định. Hầu như mọi bản phân phối đều có tập lệnh xây dựng cho mọi gói Autoconf đặt các thư mục thông thường phù hợp với bản phân phối cho từng loại. Họ thậm chí đặc biệt có một loại thư mục cho bộ đệm: sharedstatedir .


Đầu tiên cảm ơn bạn rất nhiều vì câu trả lời của bạn, thực sự rất chi tiết. Bản chất của ứng dụng (ruby) là lưu trữ các lệnh gọi API phục vụ nội dung tĩnh. Đây là ứng dụng ruby ​​và từ những gì tôi đã đọc ở vị trí trả lời của bạn cho bộ đệm đĩa của tôi sẽ là /tmpthư mục. Câu trả lời cho câu hỏi của bạn sẽ là (tải xuống, không, không, không, không, không, không). Có lẽ dường như bình thường đối với hầu hết mọi người để kết luận là /tmpvậy nhưng tôi chưa quen với các hệ thống unix và các quy ước dựa trên hệ điều hành Ubuntu không quen thuộc với tôi. Điều này mở ra ý tưởng thú vị cho gem để cho phép bộ nhớ đệm đĩa bất khả tri (thuyết bất khả tri của người dùng). Cảm ơn, +1 từ tôi.
Cá heo

Lưu ý rằng hệ thống đá quý ruby ​​như được cài đặt trên hầu hết các bản phân phối Linux có một thư mục rất cụ thể nơi các viên đá quý được cài đặt bởi gemcông cụ. Tuy nhiên, có thể không phù hợp để tạo các tệp trong thời gian chạy trong cùng thư mục nơi ứng dụng của bạn được đá quý tải xuống. Mặt khác, nếu bạn đang chạy ứng dụng với tư cách là người dùng, bạn cần một thư mục đọc-ghi cho người dùng và điều đó có nghĩa là thay đổi quyền (yêu cầu tích hợp hệ thống nhiều hơn trong thời gian cài đặt, chẳng hạn như tạo một nhóm v.v.) hoặc sử dụng thư mục đọc-ghi toàn cầu, vd / tmp.
allquixotic

Bạn không thể và không nên ghi dữ liệu vào /usr, /libhoặc /bintừ ứng dụng của bạn.
ctrl-alt-delor
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.