執行指令後如何應用 -v ?

執行指令後如何應用 -v ?

我想查看一個命令的進度,我知道該命令大約需要六個小時。我運行了一個更新腳本,卻忘記使用 -v (或我應該做的任何事情來「觀察」進度),所以我無法知道這個過程有多遠。

如果適用,我使用的命令是:

drush cvupdb

升級 CiviCRM 安裝,但這個問題並不真正適用於 CiviCRM。答案可以普遍適用於任何已經運行的進程。我會添加這個問題作為對非常相似的帖子的評論,但我還沒有足夠的聲譽,所以我需要開始一個新的主題。謝謝!

答案1

如果您有該程式的原始程式碼,您可以查看該-v選項的作用。它通常只是設定一個名為 verbose 的變量,例如:

int verbose=0
while ((opt = getopt(argc, argv, "v")) != -1) {
        switch (opt) {
        case 'v':
            verbose= 1;
            break;

在這種情況下,如果程式包含偵錯資訊(符號表),則可以將偵錯器附加到正在運行的進程並適當地設定變數:

gdb -p <pid>
n
n
...
set variable verbose=1
c

答案2

簡短的回答:一般來說你不能這樣做。

對於您的特定問題,要檢查它是否正在執行某些操作,請使用top.只需執行該top命令,使用最多 CPU 的進程就會顯示在頂部。如果它有效,drush可能應該接近頂部。

答案3

一般來說,命令或腳本所做的第一件事就是讀取參數,所以簡短的回答是,不。即使程式做了一些設定工作然後讀取參數,您也需要破解正在運行的進程的記憶體。

因此,為了從命令列回答該進程是否正在運行的問題,假設您用於運行該進程的使用者 IDc.hall

ps -fu c.hall

這將列出該使用者 ID 下運行的所有進程。現在,如果該進程啟動一個守護進程,那就更棘手了,但這應該足以讓您開始。

答案4

如中所示馬克·史都華的回答,一般來說,啟動命令後無法更改命令的參數。

但在某些情況下,可以從外部確定流程的進度。例如,向dd進程發送USR1訊號會導致其列印其進度並繼續:

kill -USR1 $(pgrep dd)

對於讀取或寫入檔案的進程,您可以使用progress(僅在 Linux 上)追蹤它們的讀取或寫入量,也許還可以了解剩餘時間 - 至少,您會看到該進程是否仍在執行任何操作:

progress -m -c dd

將監視一個dd進程。

相關內容