这是一个后续的问题,你如何使用ssh在一个shell脚本?的问题。如果我想在远程机器上执行在后台运行的命令,如何返回ssh命令?当我试图在命令末尾只包含&号时,它就挂起了。命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
什么好主意吗?需要注意的一件事是,登录到目标机器总是产生一个文本横幅,我设置了SSH密钥,所以不需要密码。
这是一个后续的问题,你如何使用ssh在一个shell脚本?的问题。如果我想在远程机器上执行在后台运行的命令,如何返回ssh命令?当我试图在命令末尾只包含&号时,它就挂起了。命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
什么好主意吗?需要注意的一件事是,登录到目标机器总是产生一个文本横幅,我设置了SSH密钥,所以不需要密码。
当前回答
我试图做同样的事情,但增加了复杂性,我试图从Java来做。因此,在一台运行java的机器上,我试图在另一台机器上运行一个脚本,在后台(使用nohup)。
从命令行,这里是工作的:(如果你不需要ssh到主机,你可能不需要“-i keyFile”)
ssh -i keyFile user@host bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""
请注意,在我的命令行中,“-c”后面有一个参数,全部用引号括起来。但是为了让它在另一端工作,它仍然需要引号,所以我必须在其中添加转义引号。
从java,这是什么工作:
ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
"\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.
它花了一些试验和错误来让它工作,但现在似乎工作得很好。
其他回答
你可以这样做……
sudo /home/script.sh -opt1 > /tmp/script.out &
这对我来说是最干净的方式:-
ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"
在此之后唯一运行的是远程计算机上的实际命令
我试图做同样的事情,但增加了复杂性,我试图从Java来做。因此,在一台运行java的机器上,我试图在另一台机器上运行一个脚本,在后台(使用nohup)。
从命令行,这里是工作的:(如果你不需要ssh到主机,你可能不需要“-i keyFile”)
ssh -i keyFile user@host bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""
请注意,在我的命令行中,“-c”后面有一个参数,全部用引号括起来。但是为了让它在另一端工作,它仍然需要引号,所以我必须在其中添加转义引号。
从java,这是什么工作:
ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
"\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.
它花了一些试验和错误来让它工作,但现在似乎工作得很好。
最快和最简单的方法是使用'at'命令:
ssh user@target "at now -f /home/foo.sh"
我在一年前写的一个程序中遇到过这个问题——结果发现答案相当复杂。您将需要使用nohup以及输出重定向,正如维基百科中关于nohup的文章所解释的那样,为了方便您,此处复制了该文章。
Nohuping后台工作是为了 通过SSH登录时有用的例子, 由于后台作业可能导致 Shell在退出时挂起 条件[2]。这个问题也可以 通过重定向这三个方面来克服 I / O流: 没有myprogram > foo。出2> foo。Err < /dev/null &