2011-12-15 31 views
14

Tôi đang cố gắng để trống một tệp trong linux khi đang sử dụng, đó là tệp nhật ký để được liên tục viết. Ngay bây giờ tôi đã sử dụng:Làm trống tệp trong khi đang sử dụng trong linux

echo -n > filename 

hoặc

cat /dev/null > filename 

nhưng tất cả điều này tạo ra một tập tin rỗng với một ký tự xuống dòng (hoặc ký tự lạ mà tôi có thể nhìn thấy như^@^@^@^@^@^@^@^@^@^@^@^.. trên vi) và tôi phải xóa thủ công bằng vidd dòng đầu tiên và sau đó lưu.

Nếu tôi không sử dụng vi adn dd Tôi không thể thao tác tệp với grep nhưng tôi cần quy trình tự động mà tôi có thể viết trong tập lệnh trình bao.

Ý tưởng?

+0

echo ""> tên tệp? –

+0

Tại sao bạn viết '@@@@' khi bạn thực sự thấy '^ @^@^@^@'? – glglgl

+0

@gigigi sửa chữa bài –

Trả lời

4

Tại sao không chỉ :>filename?

(: là một bash BUILTIN có tác dụng tương tự như /bin/true, và cả hai lệnh không tiếng vang bất cứ điều gì)

Proof rằng nó hoạt động:

[email protected] ~ $ du t.txt 
4  t.txt 
[email protected] ~ $ :>t.txt 
[email protected] ~ $ du t.txt 
0  t.txt 
+1

':' không phải là một bí danh cho '/ bin/true'. Trong bash ít nhất, đó là một lệnh null - nó không có gì. Nó luôn luôn trở lại sự thật, tuy nhiên. Nó cũng thực sự không cần thiết ở đây - bạn chỉ có thể làm '> tập tin'. – pgl

+0

@pgl có, trong bash nó là một builtin, tôi thực sự có nghĩa rằng nó có thể là một sự thay thế cho '/ bin/true'. Rephrasing ... – fge

+1

cùng một hành vi. Lần đầu tiên quá trình viết trên một tập tin nó viết @@@@@@@@ –

0

tôi có không phải là một vỏ linux đây để thử ir, nhưng bạn đã thử điều này?

echo "" > file 
+0

có, cùng một hành vi như echo -n> tên tệp nhưng với một dòng mới. Dù sao cùng một ký tự lạ ở đầu tệp –

21

này nên là đủ để trống một tập tin:

> file 

Tuy nhiên, các phương pháp khác mà bạn nói bạn đã cố gắng cũng nên làm việc. Nếu bạn nhìn thấy các ký tự lạ, sau đó chúng được ghi vào tập tin bởi một cái gì đó khác - hầu hết mọi thứ có thể là quá trình đang đăng nhập ở đó.

+0

không hoạt động, chỉ điền vào tệp có^@^@^@ – default

+0

Đồng thời trên http://superuser.com/q/90008/1771 –

3

Nếu đó là tệp nhật ký thì cách thích hợp để thực hiện việc này là sử dụng logrotate. Như bạn đã đề cập, thực hiện nó theo cách thủ công không hoạt động.

6

Một cách khác như sau:

cp /dev/null the_file 

Ưu điểm của kỹ thuật này là nó là một lệnh duy nhất, vì vậy trong trường hợp nó cần truy cập sudo chỉ có một cuộc gọi sudo là bắt buộc.

12

Điều đang diễn ra khá đơn giản: bạn làm trống tệp.

Tại sao số điện thoại đầy đủ là ^@ thì bạn hỏi? Vâng, trong một ý nghĩa rất thực tế, nó không phải là. Nó không chứa những ký tự lạ. Nó có một "lỗ".

Các chương trình được viết vào tập tin được viết một tập tin đã được mở với O_WRONLY (hoặc có lẽ O_RDWR) nhưng khôngO_APPEND. Chương trình này đã viết, ví dụ: 65536 byte vào tệp tại thời điểm bạn xóa tệp bằng cp /dev/null filename hoặc : > filename hoặc một số lệnh tương tự.

Bây giờ, chương trình sẽ chuyển đến write một đoạn dữ liệu khác (ví dụ: 4096 hoặc 8192 byte). Dữ liệu đó sẽ được ghi ở đâu? Câu trả lời là: "tại hiện tại tìm kiếm bù đắp trên mô tả tập tin cơ bản". Nếu chương trình được sử dụng O_APPEND, thì write sẽ có hiệu lực trước một cuộc gọi lseek đã thực hiện "tìm kiếm tệp kết thúc hiện tại, tức là, thời lượng tệp hiện tại". Khi bạn cắt bớt tập tin mà "kết thúc tập tin hiện tại" sẽ trở thành số không (tập tin trở nên trống rỗng) để tìm kiếm sẽ di chuyển các write bù đắp cho vị trí 0 và ghi sẽ đi đến đó. Tuy nhiên, chương trình không sử dụng O_APPEND, do đó không có hoạt động tiền tố write "đặt lại vị trí" và byte dữ liệu được ghi ở mức bù hiện tại (trong đó, một lần nữa, chúng tôi đã xác nhận là 65536 ở trên).

Bây giờ bạn có một tập tin mà không có dữ liệu trong offsets byte 0 đến 65535 đã bao gồm, tiếp theo là một số dữ liệu trong offsets byte 65536 qua 73.727 (giả sử các write viết 8192 byte). Dữ liệu "thiếu" đó là "lỗ hổng" trong tệp. Khi một số chương trình khác đọc tệp, hệ điều hành giả vờ có dữ liệu ở đó: tất cả dữ liệu không phải byte.

Nếu chương trình thực hiện các hoạt động write không thực hiện chúng trên các ranh giới khối, hệ điều hành sẽ phân bổ một số dữ liệu bổ sung (để vừa chữ viết thành toàn bộ khối) và xóa nó ra. Những byte 0 không phải là một phần của "lỗ hổng" (chúng thực sự là 0 byte trong tệp), nhưng đối với các chương trình thông thường không nhìn phía sau bức màn tại Wizard of Oz, "lỗ" zero-byte và "non -hàng "zero byte không thể phân biệt được.

Điều bạn cần làm là sửa đổi chương trình để sử dụng O_APPEND hoặc sử dụng thói quen thư viện như syslog biết cách hợp tác với các thao tác xoay vòng hoặc có thể cả hai.

[Chỉnh sửa để thêm: không chắc chắn lý do tại sao điều này đột nhiên xuất hiện trên trang đầu và tôi đã trả lời câu hỏi từ năm 2011 ...]

+0

Điều này phải được chấp nhận làm câu trả lời , vì nó hoàn chỉnh và chính xác nhất ở đây! – pgl

Các vấn đề liên quan