Bash脚本运行一个分离的循环,顺序启动backgound进程

时间:2017-08-04 21:14:47

标签: bash ssh background-process nohup sequential

我正在尝试在通过ssh连接的远程Linux服务器上运行一系列测试。

  • 我不想在运行 - >期间保持登录ssh会话nohup的(?)
  • 我不想继续检查一次运行是否完成 - > for loop (?)
  • 由于许可问题,我一次只能运行一个测试流程 - >顺序
  • 我想在处理测试集时继续工作 - >背景

这是我试过的:

#!/usr/bin/env bash
# Assembling a list of commands to be executed sequentially
TESTRUNS="";
for i in `ls ../testSet/*`;
do 
  MSG="running test problem ${i##*/}";
  RUN="mySequentialCommand $i > results/${i##*/} 2> /dev/null;";
  TESTRUNS=$TESTRUNS"echo $MSG; $RUN"; 
done
#run commands with nohup to be able to log out of ssh session
nohup eval $TESTRUNS &

但看起来nohup与eval的表现并不太好。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您希望脚本在关闭后运行,则需要

&。是的。

并且RUN中不需要nohup,因为您使用&执行命令。

现在,您的脚本在for循环中构建命令,但不执行它。这意味着您将只运行最后一个文件。如果要运行所有文件,则需要在循环中执行&命令。但是 - 您无法使用nohup eval $TESTRUNS运行命令,因为这将在后台运行命令并返回到脚本,该脚本将执行循环中的下一个项目。最终,这将并行运行所有文件。

在for循环中移动&,但再次,您无法使用run the script itself with nohup运行它。你需要做的是function createSheet() { var _container = document.getElementById("container"); checkbox = document.createElement("input"); checkbox.type = "checkbox"; var valueOfId = document.getElementById("idString").checked; ,脚本将在后台循环遍历所有文件,即使在shell关闭后也是如此。

答案 1 :(得分:0)

您可以查看screen,这是nohup的替代功能。我将使用while [ 1 ]; do printf "."; sleep 5; done替换您的测试用于测试screen解决方案 命令screen -ls是可选的,只显示正在发生的事情。

prompt> screen -ls
No Sockets found in /var/run/uscreens/S-notroot.
prompt> screen
prompt> screen -ls
prompt> while [ 1 ]; do printf "."; sleep 5; done
# You don't get a prompt. Use "CTRL-a d" to detach from your current screen
prompt> screen -ls
# do some work
# connect to screen with batch running
prompt> screen -r
# Press ^C to terminate the batch (script printing dots)
prompt> screen -ls
prompt> exit
prompt> screen -ls

Google for screenrc,了解如何自定义界面。

您可以将脚本更改为

#!/usr/bin/env bash
# Assembling a list of commands to be executed sequentially
for i in ../testSet/*; do
do 
  echo "Running test problem ${i##*/}"
  mySequentialCommand $i > results/${i##*/} 2> /dev/null 
done

如果您未在屏幕内使用nohup scriptname &或简单screen,则可以使用scriptname启动上述脚本。