使用ssh启动后台进程,运行实验脚本,然后将其停止

时间:2018-10-29 16:21:03

标签: bash ssh

我正在多台远程计算机上运行客户端-服务器性能实验。我正在尝试编写脚本来自动化实验。这是目前的样子(以简化的方式)。

for t in 0 1 2 3 4 5 6 7 8 9; do
    cmd1="ssh user@${client1} runclient --threads=${t}"
    cmd2="ssh user@${client2} runclient --threads=${t}"
    $cmd1 &
    $cmd2 &
    wait

runclient连接到我手动启动的服务器。它工作正常,但我也想自动启动和停止服务器。那是

  1. 在实验开始时在后台启动服务器
  2. 运行所有实验
  3. 实验结束时停止服务器

我已经找到了一些建议,但是我不确定哪一个对我完全有好处。有些人推荐 nohup ,但是我不确定如何使用它,而且我不明白为什么我应该重定向stdin,stdout和stderr。也许还有“-f” 选项可以ssh来启动后台进程。在那种情况下,我该如何稍后停止它?

编辑:针对评论,服务器是性能实验的一部分。我以与客户端类似的方式启动它。

ssh user@${server} runserver 

唯一的区别是,我想一次启动服务器,在具有不同参数的客户端上运行多个实验,然后停止服务器。我可以尝试类似的东西

ssh user@${server} runserver &
for t in 0 1 2 3 4 5 6 7 8 9; do
    cmd1="ssh user@${client1} runclient --threads=${t}"
    cmd2="ssh user@${client2} runclient --threads=${t}"
    $cmd1 &
    $cmd2 &
    wait

但是由于服务器没有停止,因此脚本永远不会超过第一个wait

1 个答案:

答案 0 :(得分:2)

跟踪您的PID,然后分别等待。

这也使您可以跟踪失败,如下所示:

ssh "user@${server}" runserver & main_pid=$!
for t in 0 1 2 3 4 5 6 7 8 9; do
    ssh "user@${client1}" "runclient --threads=${t}" & client1_pid=$!
    ssh "user@${client2}" "runclient --threads=${t}" & client2_pid=$!
    wait "$client1_pid" || echo "ERROR: $client1 exit status $? when run with $t threads"
    wait "$client2_pid" || echo "ERROR: $client2 exit status $? when run with $t threads"
done
kill "$main_pid"