Linux的nohup命令

昨晚在DreamHost的shell里wget了一个文件,想传到我的ftp上,却又急着回家吃饭。用ftp命令put上去,一断开连接,传输就停止了。觉得Windows都有at命令,Linux应该有定时执行的功能吧。上网查了一番,找到这篇活用Linux的后台任务,原来只要在命令后面加上&符号就可以让任务在后台运行了。不过,这只是让任务在后台执行,断开连接一样会被结束掉。又找到这篇《用nohup命令让Linux下程序永远在后台执行》,介绍了nohup命令和ncftpput程序。于是用了这么一条命令:

nohup ncftpput -u yskin -p *** ftp.server.com /wwwroot 123.zip&

执行后,用jobs命令查看到他正在运行,然后用exit命令退出shell,ftp到我的ftp服务器上,发现文件大小在不停地增加。今天早上上网,发现文件已经传完了。自己睡觉让机器干活,真爽!

好像jobs命令只能显示当前连接中的job,退出后再telnet进去就显示不出来了。另外有一个小发现,ftp服务器上的文件时间被设置过了,看来ncftpput程序会自动设置上传文件的时间呀,我用过的ftp客户端好像都没有这样的功能,以后有空要查一查。

Update:今天特别有兴趣研究这个问题:怎样在ftp 里修改FTP服务器上远程文件时间。ncftpput的帮助里有一条"-y Try using 'SITE UTIME' to preserve timestamps on remote host."好像是利用"SITE UTIME"命令来修改远程文件时间的。在网上查到说:Not many remote FTP servers support this, so it may not work.试了一下,我的两个FTP服务器都不支持这条命令,晕倒,Serv-U都不支持。无奈,去ncftp官网把NcFTP Client的源代码下了下来,直接用WinRAR搜索"UTIME",找到c_utime.c文件,里面写的很清楚了,先尝试用"SITE UTIME"命令修改,不行再用MDTM命令修改。试了一下,用ftp命令登陆,敲入quote MDTM 20060101000000 filename,修改成功,bingo.

另外,我还查到PHP里可以用touch()touch()函数修改文件的最后修改时间,和Linux里的touch命令名字一样,hoho

Update2:好像我的FTP服务器上的Serv-U FTP Server v6.0和yskin.net上的vsFTPd 2.0.3都支持MDTM命令,而DreamHost的ProFTPD 1.3.0rc2 Server不支持MDTM命令。So,只能telnet上去,用touch命令改咯。

Update3:Kirin Lin大大推荐使用Linux的screen程序。去Google找了一圈,找到《使用 Screen 看管不适合“无人看管”的终端软件》《Unix/Linux 工具: Screen 命令使用》。 这个工具就相当于在shell里再运行一个shell,就像登陆shell,然后输入bash命令,或者Win+R->cmd进Windows命令 行提示符后再输入cmd回车一样。只不过,这个新的shell可以随时暂停,而且登出shell后它还在运行,下次还能再登陆进去。

命令很简单,screen -S test即可建立一个叫test的screen,可以在这个screen里运行程序,假设我运行python:

[burns]$ python
Python 2.5 (r25:51908, Nov 23 2006, 19:51:08)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

好吧,我承认我是在炫耀刚在DreamHost上安装的Python 2.5,具体安装过程在这里有详细描述。

这时,按下Ctrl+a,再按下d键,这是显示"[detached]",表示断开了这个screen。然后,我们用screen -ls命令查看一下

[burns]$ screen -ls
There is a screen on:
1906.test (Detached) 1 Socket in /var/run/screen/S-yskin.

显示有一个已经断开连接的screen。输入exit,退出shell,然后再telnet进去。键入screen -ls命令,可以发现我可爱的叫test的screen仍然乖乖的躺在那儿。只要DreamHost主机不重启,这个screen应该一直存在吧。输入screen -r test可以重新连接上这个screen(因为我给了它个名字叫test,否则就必须记住1906这个号码咯),我的python还在。按下Ctrl+D退出python,再输入exit就可以退出这个screen,屏幕上会显示"[screen is terminating]"。唔,terminating,这个词好耳熟啊,昨天看《终结者Ⅲ》时好像听过。

Windows命令行提示符和Linux的bash可以进很多层,不过退出时要输入一层一层输入exit退出。呃,试着在一个screen里再开一 个screen,按Ctrl+A->D退出,会直接退出第一层screen。用screen -ls命令查看,可以看到第一层已经断开了,第二层还连着。不知道如果开好多层,然后用-D命令强制停止中间的某一层有什么结果,嘿嘿。

才学了几天Linux,发现Linux真好玩,比DOS好玩多了。

Update3:用nohup命令,可以直接在后台运行命 令。如果用screen,在一个screen里的时候,即使telnet断线,在登陆上去,切换进screen,还能进入断线前的页面。不过,如果用 ncftpput命令,那么命令执行完之后,screen并不会关闭。DOS下有个&符号,可以相继运行几个命令。(Windows应该是 &,纯DOS下应该是Ctrl+T吧)在Linux试了一下,&符号好像表示的是同时运行多个命令,以多线程的方式运行。所以, ncftpput还在运行,这边screen已经退出了,screen打开的bash进程也停了。不过这个ncftpput还能继续运行下去,直到上传完 文件才自行关闭,好玩的很。而|和<还有>是管道符号。刚才因为输错了命令,偶然间发现一个符号:分号;。分号间隔的命令可以相继运行。在 screen里输入ncftpput ... ;exit,等ncftpput上传完文件,这个screen就自动关闭了,hoho

还学了两个命令:ps -e查看进程,kill -9 +进程号强行关闭进程。

0 Comments:

Post a Comment



 
Copyright 2005-2007. Hello Wiki designed by Fen, Blogger Templates by Blogcrowds.