我一直在寻找这个问题的答案一段时间,但无法提出解决方案。我觉得它比看起来更复杂!
我正在尝试使用GNU screen在远程服务器上运行一个冗长的程序(运行几天),然后生成一个文本文件,说它只在该程序运行完毕后才能完成。我尝试了以下命令:
screen -d -m <long program> && echo 'finished' >> finished.txt
屏幕必须立即分离,因为这将是一个在bash中使用watch
命令的自动过程。但不幸的是,上面的命令会在命令进入后立即生成文本文件(我猜它正在计算成功执行screen
作为继续执行下一个命令的信号。我已尝试过各种其他安排,包括< / p>
screen -d -m "<long program> && echo 'finished' >> finished.txt
但在这种情况下,它甚至根本不会生成屏幕,也不会生成文本文件。另请注意,修改长程序以生成此文本文件似乎不是一种选择。
还有其他解决方法吗?任何帮助将不胜感激!
答案 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命令历史记录。