如何将 nohup 添加到 bash 命令集?

如何将 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以防我关闭会话或最后断电 --- 使用 a nohup,我保证在这种情况下,命令集仍将安排在 VPS 中执行。

我怎样才能将 a 添加nohup到这个命令集中?

答案1

您有几个选择,所有这些都保留了最后终止前台会话的要求(您可以使用kill $WB)。

  1. 如果可能,请使用 tmux(或 screen)。对于您的用例来说,这是最明显的解决方案:您一端的断开连接只会导致 tmux 会话分离,因此您发出的命令不会停止;之后,如果您想检查其输出(而不是tail -f nohup.out),您甚至可以重新附加到该会话。您甚至不需要这个kill $WB技巧,因为每个命令都是在前台执行的,所以一个简单的exit就足够了。概括: ssh 进入您的 VPS -> 执行tmux-> 键入您列出的命令(末尾不带WB=$$; (,并用简单的代替) -> 根据需要断开连接、分离和重新连接) &kill $WBexit
  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. 您还可以将脚本作为定界文档执行。它与选项 3 基本相同,但不是将命令指定为参数-c,而是将它们提供给 bash 的标准输入。请注意,如果您的脚本需要参数,则必须在调用 bash 期间指定它们,如下所示:

    nohup bash -s -- firstArgument secondArgument <<'EOF' &
    ....paste your code here.....
    EOF
    

相关内容