2012 年 08 月

浏览模式: 标准 | 列表 | 图文
nohup命令让Linux程序永远在后台执行

nohup命令让Linux程序永远在后台执行

一般 来说,我们如果需要在Unix/Linux下,让某个程序后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:/usr/local/mysql/bin/mysqld_safe –user=mysql & ,不过并非每个程序都能够象mysqld一样可以做成守护进程。也许它只是普通程序而已,这时候即使用 & 结尾,如果终端关闭,那么程序也会被关闭。但为了能后台运行,就不得不使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:nohup /root/start.sh &


在shell中回车后提示:[~]$ appending output to nohup.out

原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。这是因为,程序在提示了nohup成功后还需要按终端上键盘任意键退回到shell输 入命令窗口,然后通过在shell中输入exit来退出终端;如果你在nohup执行成功后直接点关闭程序按钮关闭终端。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

nohup语法

  用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

  退出状态:该命令返回下列出口值:

  126 可以查找但不能调用 Command 参数指定的命令。

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

  nohup命令及其输出文件

  nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

  该命令的一般形式为:nohup command &
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:nohup command > myout.file 2>&1 &

  在上面的例子中,输出被重定向到myout.file文件中。

HtmlPurifier的一个小问题:处理flash

HtmlPurifier的一个小问题:处理flash

在没有TIdy库的情况下,修复HTML我们是用htmlPurifier类库,但这个类库有点小问题。。。比如,对flash支持不好,虽然官网上有例子,可以支持yotube,不过,国内的flash视频站很多,我们不可能一一写扩展啦。怎么办?

后来有人说:

$config->set('HTML.SafeObject', true);
$config->set('Output.FlashCompat', true);
$config->set('HTML.Allowed', 'object[width|height|data],param[name|value],embed[src|type|allowscriptaccess|allowfullscreen|width|height]');

但经过测试,发现这样也不行。。不信?你去官网的Demo.php中测试一下就知道了。

测试代码可以是:
http://htmlpurifier.org/demo.php?filter[HTML.SafeObject]=1&filter[Output.FlashCompat]=1&filter[HTML.Allowed]=object[width|height|data],param[name|value],embed[src|type|allowscriptaccess|allowfullscreen|width|height]&html=%3Cp%3E%3C%2Fp%3E%3Cp%3E%3Cembed+src%3D%22http%3A%2F%2Fplayer.youku.com%2Fplayer.php%2Fsid%2FXMzIwMjQ5NTk2%2Fv.swf%22+allowfullscreen%3D%22true%22+quality%3D%22high%22+width%3D%22480%22+height%3D%22400%22+align%3D%22middle%22+allowscriptaccess%3D%22always%22+type%3D%22application%2Fx-shockwave-flash%22%2F%3E%3C%2Fp%3E&submit=Submit

所以。如果stripos($data,"embed")!==false的话,还是不要用htmlpurifier过滤了。

参考:
1、http://htmlpurifier.org/docs/enduser-youtube.html(文中有为什么不支持embed的说明)

  1. <embed> is not recognized by W3C, so if you want standards-compliant code, you'll have to get rid of it.
  2. The code is exactly the same for all instances, except for the identifier AyPzM5WK8ys which tells us which movie file to retrieve.

2、http://stackoverflow.com/questions/1368809/allow-embed-object-param-html-tags-with-htmlpurifier(即使设置了allowed,还是不行)
3、http://htmlpurifier.org/phorum/read.php?5,2239,page=3 (在这里,也还是没有解决。寄希望于下一版了。。。)

MYSQL 复制表结构

mysql复制表结构有很多方法,其中最好用的要算是:create table newtable like oldtable
除此之外还有很多办法,如果用工具的话。当然是非常方便。。比如用navicat的时候,直接选中,复制粘贴就是一个新表。然后再Truncate table newtable就完事了

除此之外还有一些命令行:
1、create table newtable select * from oldtable ,这个和上面说的用navicat工具一样。复制完后还得truncate table

2、show create table oldtable ;这个会将原表的所有结构导出,不过,问题在于,表名要修改,itoa(递增的ID)要修改

3、mysqldump ,这个就不用说了。。。没啥意思。。。出来之后还得象第二步一样操作

所以,还是用create table newtable like oldtable。。。

GO 练习四

又是一个笔记:

var tt = []int{1,2,3,4,5}
for i,j:=0,len(tt)-1; i < j; i,j=i+1,j-1 {
tt[i],tt[j] = tt[j],tt[i]
}
fmt.Println(tt);

本来以为for循环是很简单的。
我最初是这样写的
for i:=0,j:=len(tt)-1;i<j;i++,j-- {
..
}
结果直接报错:
# command-line-arguments
./tour.go:123: syntax error: unexpected comma, expecting {
./tour.go:126: non-declaration statement outside function body
./tour.go:127: syntax error: unexpected }
[Finished in 0.2s with exit code 2]

看了手册才明白。。我晶
------------------
顺便。数组有两个玩意:len,cap,理解的话一个可以当成现有长度,一个是最大长度。
如:tt := make([]int ,5)
这时候tt是被填充的{0,0,0,0,0}
如果 tt:=make([]int ,0,5);
这时候tt的最大长度是5,但结果是{},黑黑

GO 练习三

GO 练习三

先继续昨天的话题,昨天说到type xx struct的时候,如果使用map,需要注意的事项,就是最后的逗号不少能少,例如:
var m = map[string]Vertex{
"aa":Vertex{1,2,},
"bb":Vertex{3,4,},
}
其实还是有简化写法。当然这是基于m["aa"]的类型也是Vertex的情况:
var m = map[string]Vertex{
"Bell Labs": {40.68433, -74.39967},
"Google": {37.42202, -122.08408},
}
这个时候。看到没,-74后面的逗号可以省掉了。但最后的逗号还是省不掉。。。切记
-------
读取、修改、删除map很简单,就象PHP的数组一样。不过删除不太一样。。
读取:s = m["test"];
修改:m["test"] = 123;
删除:delete(m,"test");
判断key是否在map中。PHP是isset($m[$key]),而go是:
value,ret = m["test"],看上去是不是和读取很象?嗯,不过要看ret返回什么,如果是false,则value返回0,否则才是真正的m["test"]的值。。
需要注意一下
-------
对于go的数组,可以用len()函数来获取它的长度。
顺便说一下,go的内置函数很容易分别,内置函数首字符都是小写,否则,import包的话。首字符都是大写,如:fmt.Println之类的
如果熟悉python,则会发现go的数组读取和python很象。当然。。。有一点不象的是go的数组的key不允许是负数。否则会报错。。而python的负数则是从相反的方向读数据,因此python的数组反转很容易。。

GO 练习二

GO 练习二

在学到go的Struct和map的时候遇到一点纠结的事情。比方说:
type Vertex struct{
x ,y int
}
在使用的时候就可以:
var s = new(Vertex);
s.x ,s.y = 1,2
或者
var s = Vertex{1,2}
也可以。。。
不过在与map合在一起的时候就纠结了
var m map[string]Vertex
用的时候就是:
简单用法:
m = make(map[string]Vertex);
m["test"] = Vertex{1,2}

如果是多个的话,当然可以继续添加
m["test1"] = Vertex{2,3}
也可以这样:

var m = map[string]Vertex{
"test" : Vertex{1,2,},
"test1" : Vertex{2,3,},
}
您看好了这三个红色的逗号。。。
如果你不输入,直接就是报语法 错误 .开始的时候,我被它纠结死了。。。。
事实上一眼看过去。我感觉和javascript的对象很象。所以习惯性的,那些逗号都是没有输入的。。但编译的时候报错了。
而在javascript中。这些逗号都是不允许的。否则会报错

当成一个笔记记录一下

Go 文档地址

Go 文档地址

官方:http://golang.org ,好吧,经常被封

中文手册的翻译:http://code.google.com/p/golang-china

嗯,还有一个:http://zh-golang.appsp0t.com/,这个不是appspot哦,中间那是0,不过appspot.com也能看,只是。。。这又是一个墙外站。

还有几个:
1、这也是别人的学习笔记:http://www.cnblogs.com/yjf512/category/385369.html
2、某牛的网站:http://www.mikespook.com/

最后说几个编辑器:
1、liteIDE,跨平台,会教你怎么安装:http://code.google.com/p/golangide/
2、Intellij CE,可以装go的插件,但我没装好。。。
3、Sublime Text2,支持go

Go 练习一

Go 练习一

小笔记:

func test141() {
a := "this is string"
t := strings.Count(a,"") -1; //???why :before & after each rune
var s = make([]string,t);

fmt.Println(t);
for i,v :=range a{
s[t-i-1] = string(v);
fmt.Println(i,string(v));
}
}


最初的时候,我是
var s = []string{};
然后在设置的时候,告诉我 out of range,嗯,一定要设置一下s的长度
为什么上面的t要减1,还有下面的s[t-i-1]?
主要就是那段英文,官方文档里说了:。。。before & after each rune;
比如 字符串:test,那么长度不是4,而是5,这和PHP中不一样。。。要记住。。。

字符串反转还有方法是:

func test142() {
a := "this is string"
var result string;
for _,v := range a{ // _是用来占位,但不作运算而是抛弃的变量。
result = string(v)+result;
}
fmt.Println(result);
}


这个比较简单。。

为Sublime Text2添加Go语言的Build

SublimeText2现在已经是相对很流行了吧?用它来写go语言的话,也是比較方便的,最起碼語法高亮之類的是沒有問題。
不過,在Macosx平臺下還是有很多軟件的,比如LiteIDE,IntelijCE版的插件,不過都沒有SublimeText2來得輕量級。

到菜單裏,選擇:
e3d6cd22bf3f1fe69f2b32dc1436f2bc

创建一个文件,输入:

{
"cmd": ["/usr/local/go/bin/go", "run", "$file"],
"file_regex": "^(...*?):([0-9]*):?([0-9]*)",
"working_dir": "${file_path}",
"selector": "source.go"
}

其实只需要第一行也就够了。。
然后选择Build的文件:go

在xxx.go文件打开的时候,按CMD+B,OK,有输出了。。
3eda2c935d91445cc04386c3927d8296

重庆人民真辛苦

重庆人民真辛苦

重庆人民太辛苦了,40度的高温还穿羽绒服,由此我现在对国内的气候现象产生了怀疑。以前都说重庆是N大火炉之一,但是现在看来。。不一定啊。怪不得他们要经常吃火锅,因为太冷了。

pinyinconvert.zip

不过,上海热线明显不愿意让我们知道这个秘密,所以他删除了。还好:
http://cache.baidu.com/c?m=9d78d513d99f16ea19fa950e1a16a0711824dd3f628c8c4268d5e35f93134c403727b9ac26520704a4d27d1750f35e5c9bac6137761420c6ce989f4aaceacf7469df7b72671cf74110d019b8ca3632c156875b99ad13f0ba813195b9d2a28e090f8c04593c97f1fb4d0760dd6e801336e1a09c4a144811cafa3012e8580773d97c54f107a7ef682841c3e1dc2f51de7687245080af42ed624cee4ff3081b5305fa5bb17f007a2dbc1862be5968548fba00bb6c2e1c65ab48b1bac1a1eb3e8ed6f7329ee79af273d337ba83fdfe05457750fc20bcaaaab24a3e035d&p=c965f95ec5af12a059bd9b7e087a&user=baidu&fm=sc&query=http%3A//news.online.sh.cn/news/gb/content/2012-08/14/content_5504703.htm&qid=a3f434be16a2149c&p1=1

李艳红老师告诉我们,没事,其实我知道。度娘再度发力