【问题标题】:How to execute a local bash script on remote server via ssh with nohup如何使用 nohup 通过 ssh 在远程服务器上执行本地 bash 脚本
【发布时间】:2019-09-03 12:56:52
【问题描述】:

我可以使用-s 选项在远程服务器上运行本地脚本,如下所示:

# run a local script without nohup...
ssh $SSH_USER@$SSH_HOST "bash -s" < myLocalScript.sh;

我可以使用nohup 运行远程脚本,如下所示:

# run a script on server with nohup...
ssh $SSH_USER@$SSH_HOST "nohup bash myRemoteScript.sh > results.out 2>&1 &"

但是我可以在远程服务器上使用nohup 运行我的本地脚本吗?我希望脚本需要很多小时才能完成,所以我需要nohup 之类的东西。我知道我可以将脚本复制到服务器并执行它,但是我必须确保在脚本完成后将其删除,如果可能的话,我宁愿不必这样做。

我尝试了以下方法,但它不起作用:

# run a local script without nohup...
ssh $SSH_USER@$SSH_HOST "nohup bash -s > results.out 2>&1 &" < myLocalScript.sh; 

【问题讨论】:

    标签: linux bash ssh nohup


    【解决方案1】:

    您不必做任何特别的事情 - 一旦您在另一台机器上启动脚本,即使您终止连接,它也应该完成运行:

    例如

    ssh $SSH_USER@$SSH_HOST "bash -s > results.out 2>&1" < myLocalScript.sh &
    
    # Please wait a few seconds for the connection to be established
    kill $! # Optional: Kill the last process
    

    如果你想测试它,试试这样的简单脚本

    # myLocalScript.sh
    echo 'File created - sleeping'
    sleep 30
    echo 'Finally done!'
    

    results.out 文件应立即在另一台机器上创建,其中包含“文件已创建 - 睡眠”。您实际上可以使用kill &lt;your_pid&gt; 杀死本地 ssh 进程,它会仍然在另一台机器上继续运行,并在 30 秒后打印“终于完成!”进入文件,然后退出。

    【讨论】:

    • 这会使 SSH 连接在脚本执行期间保持打开状态,如果后台 SSH 作业因任何原因终止,则可能会使用 SIGHUP 将其终止。你真的想把脚本放在远程端。
    • 是的,它确实使 ssh 连接保持打开状态,但如果需要,您可以使用 kill $! 立即终止它。它不需要保持打开状态,关闭它不会改变 - 脚本将继续在远程计算机上执行。
    • 这不是我的经验。不过,nohup bash -s 对我来说就是这样。
    • 老实说 - 我很惊讶。我打算把它作为一个否定的例子来说明什么是不应该做的,但它工作得很好。试了好几次,不管在本地服务器上做什么,都无法让进程在远程服务器上停止。
    • 你是对的!我尝试了您的建议,脚本仍然完成。不得不说我很惊讶,我确信一旦ssh 连接断开,进程就会被终止,因此需要nohup
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2014-08-29
    • 2018-01-23
    相关资源
    最近更新 更多