GNU屏幕 - 仅在程序运行后执行另一个命令

时间:2015-12-15 22:07:06

标签: linux bash scripting gnu-screen

我一直在寻找这个问题的答案一段时间,但无法提出解决方案。我觉得它比看起来更复杂!

我正在尝试使用GNU screen在远程服务器上运行一个冗长的程序(运行几天),然后生成一个文本文件,说它只在该程序运行完毕后才能完成。我尝试了以下命令:

screen -d -m <long program> && echo 'finished' >> finished.txt

屏幕必须立即分离,因为这将是一个在bash中使用watch命令的自动过程。但不幸的是,上面的命令会在命令进入后立即生成文本文件(我猜它正在计算成功执行screen作为继续执行下一个命令的信号。我已尝试过各种其他安排,包括< / p>

screen -d -m "<long program> && echo 'finished' >> finished.txt

但在这种情况下,它甚至根本不会生成屏幕,也不会生成文本文件。另请注意,修改长程序以生成此文本文件似乎不是一种选择。

还有其他解决方法吗?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

screen只能将一个命令及其参数作为自己的最终参数。遗憾的是,<long program> && echo 'finished' >> finished.txt是一个shell命令,无法直接传递给screen。但是,您可以将其嵌入字符串中,并将其作为单个参数传递给shell的-c选项:

screen -d -m sh -c '<long program> && echo "finished" >> finished.txt'

根据<long program>究竟是什么,您可能需要非常小心如何转义任何报价。

答案 1 :(得分:1)

chepner's answer是一个很好的解决方案。

另一个可能更易于管理的解决方案是创建一个通过public static void removeLineFromFile(String file, String start, String end) { try { File inFile = new File(file); //Construct the new file that will later be renamed to the original filename. File tempFile = new File(inFile.getAbsolutePath() + ".tmp"); BufferedReader br = new BufferedReader(new FileReader(file)); PrintWriter pw = new PrintWriter(new FileWriter(tempFile)); String line = null; Boolean flag=true; //Read from the original file and write to the new //unless content matches data to be removed. while ((line = br.readLine()) != null) { if (line.trim().equals(start)) { flag=false; } if (flag){ pw.println(line); pw.flush(); } if(line.trim().equals(end)){ flag=true; continue; } } pw.close(); br.close(); //Delete the original file if (!inFile.delete()) { System.out.println("Could not delete file"); return; } //Rename the new file to the filename the original file had. if (!tempFile.renameTo(inFile)) System.out.println("Could not rename file"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } 调用的shell脚本,而不是动态构建一个长shell命令。

例如,您可以创建一个名为screen的脚本,看起来像这样(不要忘记run-long-command):

chmod +x

然后将其提交到#!/bin/sh if long-command ; then echo Finished > finished.txt else echo Failed > finished.txt fi ,如下所示:

screen

请注意,脚本比shell命令更有趣;它会报告screen -d -m ./run-long-command 是通过还是失败。使用脚本还意味着您可以记录脚本文件中的操作,而不仅仅是shell命令历史记录。