我有以下命令集,有时会在我的 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
)。
- 如果可能,请使用 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 $$ &
如果您不能或不想将它们放入文件中,只需像这样执行它们:
nohup bash -c " ...your commands here... ; kill $$" &
。这里$$
仍然指的是外部前台 shell,因为它在作为 bash-c
参数执行之前被替换。由于您的脚本以 2 小时睡眠开始,因此您可能需要考虑该
at
程序。您可以执行at now + 2 hours
然后键入要在 2 小时后执行的命令(粒度为 1 分钟)。输入所需的所有命令后,您可以使用 Ctrl+D 退出“at shell”,并检查atq
您的命令序列是否已计划执行。您还可以将脚本作为定界文档执行。它与选项 3 基本相同,但不是将命令指定为参数
-c
,而是将它们提供给 bash 的标准输入。请注意,如果您的脚本需要参数,则必须在调用 bash 期间指定它们,如下所示:nohup bash -s -- firstArgument secondArgument <<'EOF' & ....paste your code here..... EOF