我正在使用SSH在远程服务器上启动后台进程.这就是我现在所拥有的:
ssh remote_user@server.com"nohup process&"
这是有效的,因为这个过程确实开始了.但是在我点击Ctr-C之前,SSH会话本身并没有结束.
当我点击Ctr-C时,远程进程继续在后台运行.
我想将ssh命令放在我可以在本地运行的脚本中,所以我希望ssh会话在远程进程启动后自动退出.
有没有办法让这种情况发生?
在bash中,标准(1)和错误(2)输出可以重新路由并丢弃:
>/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
但是下面的例子做了不同的事情:
nohup myscript.sh >myscript.log 2>&1 </dev/null &
Run Code Online (Sandbox Code Playgroud)
上例中的含义/功能是</dev/null什么?在什么样的脚本方案中它会有用吗?
在ssh上运行命令时,我最近遇到了一些奇怪的行为.我有兴趣听到下面这种行为的任何解释.
正在运行ssh localhost 'touch foobar &'创建一个名为expect的文件foobar:
[bob@server ~]$ ssh localhost 'touch foobar &'
[bob@server ~]$ ls foobar
foobar
Run Code Online (Sandbox Code Playgroud)
但是,运行相同的命令但使用-t强制伪tty分配选项无法创建foobar:
[bob@server ~]$ ssh -t localhost 'touch foobar &'
Connection to localhost closed.
[bob@server ~]$ echo $?
0
[bob@server ~]$ ls foobar
ls: cannot access foobar: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我目前的理论是,由于触摸过程正在被覆盖,因此伪进程在进程有机会运行之前被分配和未分配.当然,添加一秒睡眠可让触摸按预期运行:
[bob@pidora ~]$ ssh -t localhost 'touch foobar & sleep 1'
Connection to localhost closed.
[bob@pidora ~]$ ls foobar
foobar
Run Code Online (Sandbox Code Playgroud)
如果有人有明确的解释,我会非常有兴趣听到它.谢谢.
当我尝试在shell脚本中使用ssh命令时,命令就在那里.你有一个如何在shell脚本中使用ssh的例子吗?
我有一个PHP脚本,用于侦听传入的套接字请求等.我需要在服务器上继续运行此脚本(它在无限循环内运行).
如何启动和管理此流程?我尝试通过SSH/putty启动它,但是一旦SSH连接超时,脚本就会死掉.
我想通过ssh远程启动脚本,如下所示:
ssh user@remote.org -t 'cd my/dir && ./myscript data my@email.com'
Run Code Online (Sandbox Code Playgroud)
该脚本执行各种工作正常,直到与nohup行:
nohup time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)
它应该启动程序myprog,将其输出传递给mylog并发送一封电子邮件,其中包含myprog创建的一些数据文件作为附件,日志作为正文.虽然当脚本到达此行时,ssh输出:
与remote.org的连接已关闭.
这里有什么问题?
谢谢你的帮助
我需要通过 SSH 连接到嵌入式设备,启动后台程序,然后断开连接并保持后台进程运行。问题是嵌入式设备正在使用 ash shell(不是 bash 或其他任何东西),所以 nohup 和 screen 不可用。我还没有找到任何方法来断开 ash 中的进程。有没有办法在灰烬中做到这一点?
我有一个perl脚本,script.pl,当运行时,它执行一个fork,父进程将其pid输出到一个文件,然后在子进程输出某些东西到STOUT然后进入while循环时退出.
$pid = fork();
if ( ! defined $pid )
{
die "Failed to fork.";
}
#Parent process
elsif($pid)
{
if(!open (PID, ">>running_PIDs"))
{
warn "Error opening file to append PID";
}
print PID "$pid \n";
close PID;
}
#child process
else
{
print "Output started";
while($loopControl)
{
#Do some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
当我在本地调用它时,这工作正常,即:perl script.pl.
该脚本打印出一些东西,然后将控制权返回给shell.(当子进程在后台进入循环时).
但是,当我通过ssh调用它时,控件永远不会返回到shell(也不会打印出"Output started"行).
ie:$ ssh username@example.com'perl script.pl'
然而,有趣的是,子进程确实运行(当我输入ps时我可以看到它).
任何人都可以解释发生了什么?
编辑:
我在调试下运行它得到了这个:
###分叉,但不知道如何创建新的TTY.由于两个调试器争用相同的TTY,输入严重纠缠.
我知道如何仅在xterms和OS/2控制台中将输出切换到不同的窗口.对于手动切换,将创建的TTY的名称放在$ DB :: fork_TTY中,或者定义一个返回此功能的DB :: get_fork_TTY()函数.
在类UNIX系统上,可以通过键入tty获取给定窗口的TTY名称,并通过sleep 1000000将shell与TTY断开连接.
我有 Ubuntu 14.04 ec2 实例,我的脚本上传到那里。当我想使用我的 mac 终端远程运行脚本时,我会ssh myaws "python MyFolder/myscript.py"完美运行。但是,即使在我关闭 mac 上的终端窗口或关闭我的 mac 后,我也希望脚本在 ec2 上运行。一旦我弄清楚了,我将继续使用 cron 来安排我的脚本在 ec2 上运行,而我从来没有 ssh-ing。是否有可能,如果可能,我将如何去做?如果您需要更多说明,请告诉我。谢谢。
我正在使用 java 在远程 linux 机器上执行一个简单的 bash 脚本。
名为“shortoracle.bash”的 bash 脚本有这个脚本:
#!/bin/sh
runsql() {
i="$1"
end=$((SECONDS+360))
SECONDS=0
while (( SECONDS < end )); do
echo "INSERT into table_$i (col1) values (CURRENT_TIMESTAMP);" | sqlplus username/password
sleep 1
done
}
for i in $(seq 1 10); do
echo "DROP TABLE table_$i;" | sqlplus username/password
echo "CREATE TABLE table_$i (col1 TIMESTAMP WITH TIME ZONE);" | sqlplus username/password
runsql $i &
done
wait
Run Code Online (Sandbox Code Playgroud)
简单来说:创建 10 个并行连接,执行 360 秒的查询。
从我的 Java 程序中,我执行以下命令:
sshconnection.execute("nohup su - oracle …Run Code Online (Sandbox Code Playgroud) 我需要从一个闪亮的应用程序生成一个独立的后台 Julia 进程,该进程在应用程序关闭后仍然存在。
如果 Julia 进程被称为内联:
sys::exec_background('nohup', c("julia", "-e sleep(3000)", "&")
一旦 Shiny 应用程序关闭,子进程将继续存在。
但是,如果在脚本上调用 Julia 进程,并且sleep(3000)内部有相同的调用:
sys::exec_background('nohup', c("julia", "test.jl", "&")
一旦 Shiny 应用程序关闭,Julia 进程也会因错误而被终止:
signal (2): Interrupt: 2
in expression starting at .../test.jl:1
kevent at /usr/lib/system/libsystem_kernel.dylib (unknown line)
unknown function (ip: 0x0)
Allocations: 2650 (Pool: 2641; Big: 9); GC: 0
Run Code Online (Sandbox Code Playgroud)
知道为什么以及如何让 Julia 脚本进程在父应用程序中存活的解决方案吗?
这是重现该行为的代码。https://gist.github.com/bakaburg1/5d1b5135fb3b4db1a3ca2eb7e8639aa5 只需运行 Shiny 应用程序,然后将其关闭。只有内联代码 Julia 进程才能幸存。
我正在尝试使用Linux机器上的bash脚本在远程Linux机器上自动执行某些操作并且有一个工作命令(大括号是来自cmd连接的残余):
(ssh -i /path/to/private_key user@remoteHost 'sh -c "echo 1; echo 2; echo 3; uname -a"')
但是如果一个&符连接在后台执行它,它似乎执行,但是没有输出打印,既不在stdout上,也不在stderr上,甚至重定向到文件(在大括号内)都不起作用......:
(ssh -i /path/to/private_key user@remoteHost 'sh -c "echo 1; echo 2; echo 3; uname -a"') &
顺便说一句,我ssh在Linux 2.4.37.10(在WRT54G上构建TomatoUSB)上的BusyBox v1.17.4中运行客户端dropbear v0.52.
有没有办法获得输出?这种行为的原因是什么?
编辑:
为方便起见,这里是普通的ssh帮助输出(在我的TomatoUSB上):
Dropbear client v0.52
Usage: ssh [options] [user@]host[/port][,[user@]host/port],...] [command]
Options are:
-p <remoteport>
-l <username>
-t Allocate a pty
-T Don't allocate a pty
-N Don't run a remote command
-f Run in background after auth
-y Always accept …Run Code Online (Sandbox Code Playgroud)