Nohup

如何將 nohup 添加到 bash 命令集中?

  • December 30, 2016

我有以下命令集,有時會在我的 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)。

  1. 如果可能,請使用 tmux(或 screen)。對於您的案例,這是最明顯的解決方案:您的斷開連接只會導致 tmux 會話的分離,因此您發出的命令不會停止;之後,如果您想檢查其輸出(而不是tail -f nohup.out),您甚至可以重新附加到該會話。你甚至不需要這個kill $WB技巧,因為每個命令都在前台執行,所以一個簡單的exit就足夠了。摘要: ssh 進入您的 VPS -> 執行tmux-> 鍵入您列出的命令(沒有WB=$$; (,) &在末尾並kill $WB用簡單的 代替exit)-> 根據需要斷開連接、分離和重新連接
  2. 如果您不能或不想使用 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

引用自:https://unix.stackexchange.com/questions/333538