所以我遇到类似于how to send ssh job to background的问题。
我有一个windows c#程序自动执行使用http://sshnet.codeplex.com/在远程linux os上执行tcpdump。我正在尝试在远程linux上执行tcpdump,并在断开连接后保持运行。
我一直在使用plink进行大量调试,但似乎无法达到预期的效果。我试过了:
plink root@10.5.1.1 bash -c "tcpdump -i eth0 -w test.cap"
但它保留了sshclient,直到我ctrl + C(不适用于自动化解决方案)。我也尝试了各种变体:
plink root@10.5.1.1 bash -c "tcpdump -i eth0 -w test.cap &"
但是该命令根本不执行(test.cap不存在)或立即终止(test.cap包含1行)。在测试期间,我已经离开了ping,所以捕获应该有 somthing ......
前面提到的链接解决了 screen 的问题,但是远程linux os不可配置且没有屏幕。欢迎任何建议。
答案 0 :(得分:5)
在后一种情况下,当您断开连接时,您的tcpdump
进程可能会被中止。尝试:
plink root@10.5.1.1 bash -c "nohup tcpdump -i eth0 -w test.cap &"
请参阅nohup
的联机帮助页。您可能还需要考虑将stdout和stderr重定向到文件或/dev/null
以防止nohup
将输出写入文件:
plink root@10.5.1.1 bash -c "nohup tcpdump -i eth0 -w test.cap >/dev/null 2>&1 &"
答案 1 :(得分:2)
启动远程应用程序时遇到了类似的问题。这种模式在Debian服务器上对我有用:
ssh root@server "nohup /usr/local/bin/app -c cfg &; exit"
另外:进行另一次测试,上面没有用,即。该命令未在远程服务器上启动。添加在退出之前成功返回的命令似乎有效。
ssh root@server "nohup /usr/local/bin/otherapp &; w; exit"
答案 2 :(得分:1)
我有类似的情况: (在Windows机器上)我想创建一个ms批处理脚本来打开与raspberry pi的SSH连接并在后台执行本地脚本。 我发现将Raj和fahd的答案结合起来对我来说很有用:
我的ms批处理脚本:
plink -load "raspberry Pi" -t -m startCommand.txt
startCommand.txt 的内容如下:
nohup /home/pi/myscript >/dev/null 2>&1 &
w
exit
"> / dev / null 2>& 1"很重要! 我发现(困难的方式)RPi的SD卡通过一个非常大的nohup.out文件(并且使用完整的SD卡,RPi甚至无法正常登录)保持满满。
推理:
我使用-load在PuTTY中加载已保存的会话(我这样做是因为我使用公钥/私钥而不是密码进行身份验证,但这应该与在主机中输入相同)
然后-t(由Raj推荐)
然后-m加载该文件中的命令列表
没有参数" -t"没有" w"和"退出",我的批处理脚本只会运行,而不是执行' myscript'并再次关闭。
答案 3 :(得分:0)
我有同样的问题。我有一个我没有tcpdump的脚本....& 。当ssh完成时,我无法使用ssh来运行它。我提出的解决方案非常简单。我刚刚将sleep 5添加到我脚本的末尾,它运行得很好。看来tcpdump需要几秒钟才能在你退出之前安全地进入后台,即使是nohup也是如此。
答案 4 :(得分:0)
我遇到了同样的问题,我发现“-t”选项似乎对nohup很重要。如果没有“-t”选项,我发现nohup没有生效。
ssh -t user@remote 'nohup tcpdump -i any -w /tmp/somefile &>/dev/null & sleep 2'
答案 5 :(得分:0)
我认为我已经把它钉了,至少在IBM AIX上是
我正在使用
ssh -tq user@host "/path/start-tcpdump.ksh"
(通过publick键进行身份验证)。 我使用简单的“nohup tcpdump ....&”来获得不一致的结果,有时它有效,有时它没有,有时它甚至被阻止,我不得不断开会话。 到目前为止,这工作正常,我不能说它为什么工作,但它是......
这是我的开始-tcpip.ksh
#!/usr/bin/ksh
HOST=$(uname -n)
FILTER="port not 22"
(tcpdump -i en1 -w $HOST-en1.cap $FILTER >/dev/null 2>&1 ) &
sleep 2
(tcpdump -i en2 -w $HOST-en2.cap $FILTER >/dev/null 2>&1 ) &
sleep 2
exit 0