|  | 
 
| 
' Z2 [( i$ ~( ~5 T; _4 {1 s
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  有时我们需要远端服务器上运行MATLAB(当然,也包括其它程序,这里将MATLAB作为一个例子)。但不希望被其它人无意之间关闭,包括shell终端窗口或MATLAB窗口本身(以linux操作系统为例,windows只需作小的改动——可查看MATLAB官方的启动方法说明)。这时,最好的办法就是后台执行,没有任何窗口显示。(当然,可通过命令查看到运行的进程。)* `  ~$ B  c* Y- b; @
 
 1 w0 Z3 X" b1 y8 R: V  ^方法如下:' U" \( i- S8 s0 [  Z, h
 
 8 Z, A' r2 y" Q' \) D! ^$ x" w1.用TurboVNC viewer远程接入服务器,输入IP及端口号,密码等信息。
 ) f; `% P( Z- b# J0 G- a) K" a2 y% A
 2.进入程序所在文件夹,右键启动shell终端,输入如下命令:$ `8 }- H8 D" l; u! |; E
 
 9 P  c6 `7 Z5 O4 G2 l- W7 p/ Znohup /opt/matlab/R2011a/bin/matlab -nodisplay -nodesktop -nojvm -nosplash -r "NewEval" -logfile "NewEvalOutput.txt" &
 2 b: O5 }7 |- I* t, }) x* ]& x7 O. T# n0 H" l  d1 _! I
 回车后,提示:appending output to nohup.out (表示成功执行)
 ) f% g6 H- L: N  B3 f7 E6 q+ F* p% }) r) e+ Q* U' w; c
 按任意键,出现命令输入提示行,输入exit,退出shell终端。 (注:不要直接关闭。)
 . ]2 O" S' i) ?8 k9 x/ `' X5 n$ |& X0 i
 3.查看进程运行情况:ps -ef|grep matlab6 [; |; G. x$ @( K5 j
 : a" f7 k  g- p+ ]3 ]
 ——当然,也可以以后随时查看,如果不接入服务器,可使用WinScp的控制台,即:
 " J6 z0 k0 f9 `
 : `2 j3 X5 `' Y& t; j7 L4. WinScp - Console - 输入密码 - 在命令窗口输入3中提到的命令,可查看相关所有的信息,如:用户,进程ID,进程启动时间,已运行时间,输入的命令,等等。(我用的winscp507setup.exe)WinScp功能很强大,但有时直接在console中输入命令传递给服务器执行会出错(执行程序的命令可能会出错,但其它的文件操作命令好像是正常的),因此,如果最初启动程序,很可能还是得远程接入,如:TurboVNC或远程桌面控制,等等。9 _* p; t9 h! ?/ L4 {6 S3 L6 e
 7 }+ ]- c$ ?% g+ _' W
 注:若有更好的方法,希望和大家一起讨论。
 0 _# s5 f+ s6 O" ~+ P) \
 / x& F  v+ E( J, H. g1 f3 H: z5 A; ~8 n% _
 -------------------------------------------------------------
 & C5 E, u6 z5 |! V
 - z; K& t) t  q; pUnix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:/ R% z/ y( i0 i' ^# y" Q* _
 ' I' T2 P" S0 h# p2 v1 [
 /usr/local/mysql/bin/mysqld_safe --user=mysql &+ W+ ]! G/ Q0 n0 n# p# c# a7 \6 P
 " E) ^" P, |5 i* v
 但是我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭。为了能够后台运行,我们需要使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:
 ( C! C. j4 f& ?) o) ]) {& c! S9 y4 L0 L3 F2 _. \9 K! e
 nohup /root/start.sh &
 ) t' r! T  o( Z) b3 H8 i
 * z  s3 b8 M/ Z5 T% X& V. y  {: Z          在shell中回车后提示:6 N) T: l- f; ^4 q0 u* U8 B
 7 ~+ P* M3 g$ Z! x/ \# X
 [~]$ appending output to nohup.out5 H) G4 `; T( k& m9 s% ?& _% m
 + W% N9 K$ D7 \9 W7 m0 s7 t! V
 原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。9 I4 U; Z2 s- w
 
 % c7 e' X' Y3 \. q$ u% {! I, \但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。$ S) H' U" ?( ?+ |9 M- e9 ]3 r
 
 3 b1 }# |8 Z* X. @$ Y6 U咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。. `2 ^6 ^3 c& `- W$ t3 j- d- ?$ w1 x
 5 I: `/ z. L" Q# M* y* v4 E
 在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:他是在当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。8 T! b) W! ]' I6 b! V: P
 Y  `9 u7 U* B2 ?1 x: X
 这个细节有人和我一样没注意到,所以在这儿记录一下了。$ D( ]- Q" D& K6 W, m4 \) v& h4 [% F
 - w# z- w& V: I- |9 R9 o0 c
 附:nohup命令参考
 2 F6 `4 c# }. k
 8 P) ?$ ?' }$ a5 S( Tnohup 命令/ M; f0 w5 x6 _, O
 4 p( O) Y# d9 `5 \! l
 用途:不挂断地运行命令。
 $ X2 t  n: `. Y* D4 ?9 C2 `2 S5 B* [1 V% a2 R6 H0 h
 语法:nohup Command [ Arg ... ] [ & ]& @' m. h/ s4 C0 X% r+ g
 " w# h" f$ H, F# L
 描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示"and"的符号)到命令的尾部。0 a+ |" x% J+ x6 U$ `. k
 3 l# ]/ i" H- ?# v, Q' R# V8 W2 R. l
 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
 4 f$ o0 Z" l& n' z
 * I, e  [* k) [" p/ V  退出状态:该命令返回下列出口值:% J4 I, P! b4 b9 J
 
 4 F+ I( ?" s6 d: N  126 可以查找但不能调用 Command 参数指定的命令。2 E7 h  f  W9 C  Y/ z# N: i
 - u" y3 q6 c+ t& |
 127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
 4 q! S0 c. h0 z. X  c* n
 $ N; d$ {; b8 d( ~! ^/ |  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
 ( l4 C, g  \, @, T) R1 r6 K
 ! s' H! f( w" k, I! F  nohup命令及其输出文件
 8 I( ^. L  I+ N( q# a6 t, _/ S7 T& t
 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。0 {* e7 k. I& i) K  L6 o; N
 
 2 w  C  Z" o- {) n9 [4 X" Y8 Y. z1 h7 H  该命令的一般形式为:nohup command &9 l6 j7 |% E( @* F9 I
 * t5 K. R: R+ Q+ x0 c# |& ~
 使用nohup命令提交作业! D# L, G* j4 n
 4 D/ {; A9 y) X9 Q, m- s
 如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
 : E" a8 R% z+ A1 \, c2 C2 n7 z) X0 b% e4 E' P# `2 _
 nohup command > myout.file 2>&1 &( G' H2 Z: }7 [# V- J$ Z2 ~
 
 ( M' D9 e. B/ j7 S7 U3 Z: P  在上面的例子中,输出被重定向到myout.file文件中。0 p+ u9 I+ {8 e1 A
 , R  @4 G# ^$ ]
 使用 jobs 查看任务。
 9 I+ `3 y! h* y3 Q: x) `- P# `
 # u0 G: E+ ~  y6 c6 }& M8 C" D  使用 fg %n 关闭。. A! B# v8 }: t5 S
 7 U% F; X6 ~' O4 @+ [1 B  f9 r
 另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样就可以利用这些命令在后台上传和下载文件了。
 | 
 |