我想在后台下载并运行一个脚本,以便该任务独立于 shell 及其退出。此外,该脚本应该作为 运行sudo
,使用:
echo MY_PWD | sudo -u MY_USER -S ...
因此,它只需要在我的 SSH 会话中添加一行代码,即可执行身份验证并创建包含多行的后台任务。此外,在成功或失败执行后,应删除安装脚本NEW_SCRIPT_NAME.sh 代码行是:
wget https://URL_TO_SCRIPT.sh -O NEW_SCRIPT_NAME.sh
sed -i 's/\\r$//' NEW_SCRIPT_NAME.sh
chmod +x NEW_SCRIPT_NAME.sh
sudo nohup NEW_SCRIPT_NAME.sh &
rm NEW_SCRIPT_NAME.sh
我尝试这样做:
echo raspberry | sudo -u pi -S wget https://URL_TO_SCRIPT.sh -O NEW_SCRIPT_NAME.sh && sed -i 's/\\r$//' NEW_SCRIPT_NAME.sh && chmod +x NEW_SCRIPT_NAME.sh && nohup ./NEW_SCRIPT_NAME.sh & && rm NEW_SCRIPT_NAME.sh
这会导致以下错误:
-bash: syntax error near unexpected token `&&'
可以通过删除来修复&行中nohup
,但这将导致脚本在前台而不是后台执行,这对于我的目的是必要的。
答案1
这是 bash 中的错误语法:
nohup ./NEW_SCRIPT_NAME.sh & && rm NEW_SCRIPT_NAME.sh
从外壳检查:
Line 1:
nohup ./NEW_SCRIPT_NAME.sh & && rm NEW_SCRIPT_NAME.sh
^-- SC1070: Parsing stopped here. Mismatched keywords or invalid parentheses?
您不能简单地运行something & && something
,因为将第一个命令放入后台可以防止您等待脚本返回代码。
您可以在后台 nohup 下运行整个管道(最好作为脚本):
nohup ./run.sh &
或者,如果您确实想在一个命令中包含所有内容,则需要等待结果:
nohup ./NEW_SCRIPT_NAME.sh & wait && rm NEW_SCRIPT_NAME.sh
它将等待脚本完成,然后再将其删除。