我運行了以下程式碼區塊(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+ C。At
也會提示以下警告,這是正常的,並且硬編碼在實用程式的原始程式碼中。當我這樣做時CTRL,C警告就會消失,我可以再次定期使用 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 -y
bash
管道 ( ) 左側的命令|
將您的此處文件作為其標準輸入。在 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 -y
。at
然後嘗試解釋該輸出 - 不是您的apt-get
命令,而是它的輸出-- 作為要在 中執行的命令清單/bin/sh
。
所以這幾乎肯定不是您想要做的。
我不確定為什麼輸入代碼後沒有立即返回 shell 提示符。當我在測試機器上運行它時,我會在幾秒鐘內收到 shell 提示符。如果你想調試這個,你可以嘗試apt-get purge phpmyadmin -y
在 bash 中交互運行。按照您的程式碼編寫方式,該命令可以完全運行前 at
返回 shell(之前at
可以安排任何事情)。不過,進一步調試這個特定程式碼可能沒有用。