2012-04-29 70 views
0

我需要能夠將文本文件複製到其他位置,然後刪除此文本文件的內容(不刪除文件)。在bash中複製活動寫入到bash中的文件

目前,我這樣做:

#!/bin/bash 

count=0 

    for filename in `find . -name "*_list" -print` 
    do 
     while read -r line 
     do 
     echo $line 
     sync 
     echo "### Trace Info ###" > log.txt 
     sync 
     python worker.py "$line" 
     echo $line > traces/trace$count.txt 
     sync 
     sync 
     sleep 1 
     sync 
     sync 
     cp log.txt traces/trace$count.txt 
     #cp log.txt traces/log.txt 
     sync 
     sleep 1 
     count=$((count+1)) 
     done < $filename 
    done 

但調用同步睡覺它不是爲我工作,而不是我得到的文件是這樣的: (注:蟒蛇文件沒有寫日誌。 txt CacheGrind是)。

CachegrindMemMod/vg-in-place --tool=cachegrind --trace-children=yes /usr/sbin/mysqld 2>log.txt 

cat trace10.txt | xxd 
0000000: 2323 2320 5472 6163 6520 496e 666f 2023 ### Trace Info # 
0000010: 2323 0a00 0000 0000 0000 0000 0000 0000 ##.............. 
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
0000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 

這個跟蹤有4兆字節的零應該是文本。

ls -la trace10.txt 
-rw-r--r-- 1 root root 4350121 2012-04-29 15:34 trace10.txt 

我猜有一些緩存事情是阻止我能夠得到的利息文本。任何想法都會很棒。

如果您有興趣的文件應包含CacheGrind的修改版本,看起來像這樣獲取的內存地址的列表:

Dw: 0x4916e30 
Dw: 0x4916df0 
Dw: 0x4916db0 
Dw: 0x4916d70 
Dr: 0x4916d30 
Dr: 0x4916cf0 
Dr: 0x4916cb0 
Dr: 0x4916c70 
Dr: 0x4916c30 
Dr: 0x4916bf0 
Dr: 0x4916bb0 
Dr: 0x4916b70 
Dr: 0x4916b30 
Dr: 0x4916af0 
Dr: 0x4916ab0 

CacheGrind也修改後的版本,可以發現here

附加信息: 我注意到有些文件只包含頭文件而且沒有空數據。這也讓我想到它的I/O緩存問題

+0

沒有必要用'$(...)'來啓動子shell來增加'$ count'。你可以用'count = $ [count + 1]' – dschulz

+0

@dschulz:它是'$((expr))''做一個不同的事情,並且它不會在子shell中執行。 –

+0

@KolyolyHorvath我錯了,謝謝! TIL關於'$((表達式))'。很長一段時間,我認爲任何以'$('開始與子外殼有關的東西 – dschulz

回答

1

誰在寫log.txt文件? python腳本?它在後臺工作嗎?如果是這樣,爲什麼試圖複製(未完成)文件?你爲什麼試圖在bash腳本中同步?

  • 擴展腳本,以便它允許日誌文件作爲一個命令行參數,所以每次調用將要寫入到一個單獨的文件中。
+0

python文件只對我追蹤的程序執行命令.CacheGrind正在寫入log.txt,它需要一點這個程序的初始化和我只需要特定命令的痕跡,而不是初始化,所以我必須複製一個不完整的文件,並在拷貝後刪除內容,我將添加上面的CacheGrind命令 – kporter

+0

這很容易出錯,你會產生時間問題,只是用grep,awk等處理輸出文件...... –

+1

啊哈!你的問題是沒有任何東西告訴CacheGrind回溯到文件的開頭,它從原來的位置開始,並且內核用零填充空間(實際上可能不佔用磁盤空間)我同意Karoly的觀點,你要做的事情很容易出錯,你應該在cachegrind完成之後對文件進行後處理h it。 – zwol