将多行shell脚本转换为一行命令 我使用C++ APP来计算结果,然后用ECHO打印结果到费多拉Linux中的一个文件。 #!/bin/bash cd myapp out=`time ./cppcode` cd .. echo $out >> a
我正在使用ssh,myapp的平均运行时间是2小时,所以ssh连接经常会消失,终端也会停止响应。我仍然可以通过另一个终端ssh并使用将多行shell脚本转换为一行命令 我使用C++ APP来计算结果,然后用ECHO打印结果到费多拉Linux中的一个文件。 #!/bin/bash cd myapp out=`time ./cppcode` cd .. echo $out >> a,c++,linux,shell,ssh,C++,Linux,Shell,Ssh,我正在使用ssh,myapp的平均运行时间是2小时,所以ssh连接经常会消失,终端也会停止响应。我仍然可以通过另一个终端ssh并使用top查看我的应用程序是否正在运行,但2小时后没有结果保存到文件中 我相信如果我执行一行命令,结果就会被打印出来。你能告诉我如何把这个脚本改写成一行吗?我不相信把脚本改成一行会对你有帮助。你可以自己尝试一下: cd myapp; out=`time ./cppcode`; cd ..; echo $out >> a 或更简单: (cd myapp; t
top
查看我的应用程序是否正在运行,但2小时后没有结果保存到文件中
我相信如果我执行一行命令,结果就会被打印出来。你能告诉我如何把这个脚本改写成一行吗?我不相信把脚本改成一行会对你有帮助。你可以自己尝试一下:
cd myapp; out=`time ./cppcode`; cd ..; echo $out >> a
或更简单:
(cd myapp; time ./cppcode) >> a
请注意,仅重定向stdout永远不会捕获time
命令的输出。如果你想重定向它,你可以添加类似于2>>a.time\u results
的内容,或者简单地添加2>&1
将它重定向到a
我认为您的连接被关闭是因为它的空闲时间太长(大约十分钟没有传输数据)
解决此类问题的典型方法是实现一个相当流畅的输出,例如。G通过打印一个进度(可能是一个进度条,也可能是一个简单的点)
另一种方法是使用终端多路复用器,如
screen
,以便以后能够重新连接到正在运行的会话,即使您的ssh连接在此期间中断。只需启动ssh
,然后在shell中启动屏幕,然后在该屏幕中启动真正的东西。如果连接中断,只需启动ssh
,然后screen-x
即可重新连接到正在运行的screen会话。要尝试使用单个命令执行相同的操作,请执行以下操作:
#!/bin/bash
time myapp/cppcode 2>> a
应该这样做
(假设cppcode
不依赖CWD作为myapp
文件夹)
虽然基本上您会发现在ssh连接失败后,后续命令不会执行
所以
至少应确保输出总是被写入(因为丢失的唯一命令是cd..
)
或者,如果您的应用程序不依赖于当前目录:
time myapp/cppcode >> a
您可能需要使用屏幕
。通过屏幕启动脚本,从屏幕会话中分离,去吃一些午餐并重新连接到您的会话以查看进度。考虑运行<代码> NOHUP时间MYAPP/CPPPCODE < /代码>;这将运行命令并计时,输出(标准输出和标准错误)将转到/nohup.out
。这将忽略ssh
会话超时时生成的SIGHUP信号(因此nohup
)。不清楚为什么要执行回显
;为什么不直接将命令的输出重定向到文件:/myapp/cppcode>a
或主题的变体。我现在尝试的解决方案确实是屏幕
。您知道screen-x
和screen-r
之间的区别吗?使用-x
您也可以附加到未附加的屏幕会话(因此,如果您仍然从其他地方连接到同一会话,它也会起作用)<代码>-r
将仅附加到分离的会话。如果会话已分离,则两者都会执行相同的操作。
cd myapp
time ./cppcode >> ../a
time myapp/cppcode >> a