為什麼使用「At」實用程式後無法自由使用 bash? (無法插入標準輸入,直到 ctrl+c)

為什麼使用「At」實用程式後無法自由使用 bash? (無法插入標準輸入,直到 ctrl+c)

我運行了以下程式碼區塊(at卸載 PHPmyadmin 逾時)。它應該安排提前運行 2 個小時,但我在 2 分鐘的超時時間內運行它,只是為了測試它:

bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'

apt-get purge phpmyadmin -y
PMA_UNINSTALL

at實用程式似乎阻止我自由使用 Bash,除非我使用CTRL+ CAt也會提示以下警告,這是正常的,並且硬編碼在實用程式的原始程式碼中。當我這樣做時CTRLC警告就會消失,我可以再次定期使用 Bash。

命令將使用 /bin/sh 執行

我並不是說只要它出現,這個警告就會阻止我定期使用 Bash。我知道警告只是標準輸出,其他東西可能會阻止我創建標準輸入。

是什麼阻止我創建 stdin 管道傳輸上面的程式碼區塊,at以及如何達到這樣的狀態:我可以執行透過 at 管道傳輸的命令,但之後可以自由地使用 Bash 而不會中斷at工作?

答案1

我花了一些時間才看到你真正的問題 - 你想直接發送命令,at而不是像我假設的那樣事後提供命令。

不需要複雜的方案,只需輸入

echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'

當您以這種方式執行此操作時,at之後不需要任何輸入,並且您會立即返回命令列。


(這裡保留我原來的答案)

發出at使您可以列出要執行的命令。你必須告訴at你你已經完成了:

CTRL+ D(這也稱為傳輸結束

答案2

TL;DR:這些命令似乎沒有達到您預期的目的。

如果您嘗試在 2 分鐘內at執行,那麼您的程式碼將不會執行您想要的操作。apt-get purge phpmyadmin -ybash

管道 ( ) 左側的命令|將您的此處文件作為其標準輸入。在 shell 讀取完整的此處文件之前,該命令甚至不會運行。

3.6.6 此處文檔在裡面Bash 參考手冊:

這種類型的重定向指示 shell 從目前來源讀取輸入,直到一行僅包含單字(沒有尾隨空白)可見。到該點讀取的所有行都將用作標準輸入(或檔案描述符n如果n被指定)為一個命令。

實際上,具有此處文件的命令只是一個命令,在執行之前必須由 shell 完全讀取該命令。在您的程式碼中,shell 讀取輸入直到 PMA_UNINSTALL單獨出現在一行上。一旦發生這種情況,外殼然後使用此處文件的內容作為命令的文件描述符 50 bash /dev/fd/50

bash在完全閱讀此處的文檔之前,該命令甚至不會啟動 的新實例。當bash運行時,它運行此命令:

apt-get purge phpmyadmin -y

由於整個管道的左側包括這裡的文檔其標準輸出經由管道傳輸到at,輸入at獲取的是輸出bash,這是 的輸出apt-get purge phpmyadmin -yat然後嘗試解釋該輸出 - 不是您的apt-get命令,而是它的輸出-- 作為要在 中執行的命令清單/bin/sh

所以這幾乎肯定不是您想要做的。

我不確定為什麼輸入代碼後沒有立即返回 shell 提示符。當我在測試機器上運行它時,我會在幾秒鐘內收到 shell 提示符。如果你想調試這個,你可以嘗試apt-get purge phpmyadmin -y在 bash 中交互運行。按照您的程式碼編寫方式,該命令可以完全運行 at返回 shell(之前at可以安排任何事情)。不過,進一步調試這個特定程式碼可能沒有用。

相關內容