Nohup
如何將 nohup 添加到 bash 命令集中?
我有以下命令集,有時會在我的 VPS 上執行。基本上它工作正常;它在後台執行並執行我需要的操作。
WB=$$; ( sleep 2h; echo "Removing PMA and exiting"; phpdismod mcrypt mbstring; apt-get purge phpmyadmin -y; service apache2 restart; sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g' /etc/apache2/apache2.conf; kill $WB ) &
我唯一想念的是:
我在這個命令集中唯一想念的是
nohup
.nohup
在我關閉會話或停電的情況下使用它對我來說很重要—nohup
在這種情況下,我保證命令集仍將被安排在 VPS 中執行。我怎麼能
nohup
在這個命令集中添加一個?
您有幾個選項,所有這些選項都保留了您在結束時終止前台會話的要求(您使用 執行此操作
kill $WB
)。
- 如果可能,請使用 tmux(或 screen)。對於您的案例,這是最明顯的解決方案:您的斷開連接只會導致 tmux 會話的分離,因此您發出的命令不會停止;之後,如果您想檢查其輸出(而不是
tail -f nohup.out
),您甚至可以重新附加到該會話。你甚至不需要這個kill $WB
技巧,因為每個命令都在前台執行,所以一個簡單的exit
就足夠了。摘要: ssh 進入您的 VPS -> 執行tmux
-> 鍵入您列出的命令(沒有WB=$$; (
,) &
在末尾並kill $WB
用簡單的 代替exit
)-> 根據需要斷開連接、分離和重新連接- 如果您不能或不想使用 tmux,請將您的命令放在一個文件中。這裡的問題基本上是
nohup
不能執行分組命令(子shell的概念是bash獨有的,你不能用nohup執行一個),所以你可以把你的程式碼放在/opt/myscript.sh
文件中:#!/bin/bash #You will pass the PID of the foreground shell as its first argument WB=$1 sleep 2h; echo "Removing PMA and exiting"; phpdismod mcrypt mbstring; apt-get purge phpmyadmin -y; service apache2 restart; sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g' /etc/apache2 /apache2.conf; kill $WB
然後你可以執行它
nohup /opt/myscript.sh $$ &
3. 如果您不能或不想將它們放入文件中,只需像這樣執行它們:nohup bash -c " ...your commands here... ; kill $$" &
. 這裡仍然指的是外部前台 shell,因為它在作為 bash參數$$
執行之前被替換。-c
4. 由於您的腳本以 2 小時睡眠開始,您可能需要考慮該at
程序。您可以執行at now + 2 hours
然後鍵入要在 2 小時後執行的命令(以 1 分鐘為粒度)。鍵入所有需要的命令後,您可以使用 Ctrl+D 退出“at shell”並檢查atq
您的命令序列是否已安排執行。 5. 您還可以將腳本作為heredoc 執行。它與選項 3 基本相同,但不是將命令指定為-c
參數,而是將它們提供給 bash 的標準輸入。請注意,如果您的腳本需要參數,則必須在呼叫 bash 期間指定它們,如下所示:nohup bash -s -- firstArgument secondArgument <<'EOF' & ....paste your code here..... EOF