我对亚马逊还很陌生。我有一个 Java 文件,可以读取 GB 级的爬网数据,并且我正在使用 AWS ToolKit for Eclipse 运行该文件。这里的缺点是,如果我需要读取整个爬行数据,我必须让我的机器运行数周,而这是不可能的。除此之外,我无法将 GB 的数据下载到本地 PC(因为它正在读取数据)。
有什么方法可以让我将 Jar 上传到亚马逊,然后亚马逊在不与我的计算机交互的情况下运行它?我听说网络爬虫在亚马逊运行了数周,却没有将数据下载到开发人员的机器上,并且几个月来都不让开发人员在不关闭的情况下打开他的机器。
我要求的功能就像 Amazon Elastic Map-Reduce 中的“作业流程”。您上传代码,它会在内部运行它。无论您是否保持“您的”机器处于开启状态,都没有关系。
最佳答案
您可以使用 nohup 运行*nix 的命令
nohup java -jar myjar.jar 2>&1 >> logfile.log &
这将运行您的 jar 文件,将输出 [stderr 和 stdout] 定向到 logfile.log
。需要 &
以便它在后台运行,从而释放命令行/shell/
!!编辑!!
值得注意的是,我发现在工作开始后停止它的最简单方法是:
ps -ef | grep java
返回ec2-user 19082 19056 98 18:12 pts/0 00:00:11 java -jar myjar.jar
然后杀死19082
。
请注意,您可以 tail -f logfile.log
或其他此类衍生物 [less、cat、head] 来查看 jar 的输出。
回答问题/评论
嗨。您可以使用 System.out.println() ,是的,它最终会出现在 logfile.log 中。指示这一点的命令是 2&>1
,意思是“将流 2 重定向到流 1”。在 UNIX 中,这意味着将 stderr 重定向/管道到 stdout。然后我们指定>> logfile.log
,这意味着“将输出附加到logfile.log”。当 System.out.println() 写入 stdout 时,它最终会出现在 logfile.log 中。
但是,如果您的应用程序设置为使用 Log4j/commons-logging,则使用 LOG.info("statement");
将最终出现在配置的“log4j.properties”日志中文件。使用此配置,最终出现在 logfile.log
中的语句将是系统生成的语句(错误、Linux 内部系统消息)或显式写入 stdout 的任何内容(即 System.out.println()
) 语句;
关于java - 如何在 Amazon EC2 中运行 Jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21314700/