Unix/Linux命令行小技巧(3)- 把命令输出到多个日志文件

可以使用tee命令把命令输出到多个日志文件:
举个例子:

[root@localhost command]# free -m | tee mem1.log mem2.log
         total       used       free     shared    buffers     cached
Mem:         32062       9922      22140          0        906       3451
-/+ buffers/cache:       5563      26498
Swap:        31999       9313      22686
[root@localhost command]# ls
mem1.log  mem2.log
[root@localhost command]# ls -alt
total 16
drwxr-xr-x  2 root root 4096 Jan 12 10:48 .
-rw-r--r--  1 root root  230 Jan 12 10:48 mem1.log
-rw-r--r--  1 root root  230 Jan 12 10:48 mem2.log
drwxrwxrwx 15 root root 4096 Jan 12 10:47 ..
[root@localhost command]# cat mem1.log
             total       used       free     shared    buffers     cached
Mem:         32062       9922      22140          0        906       3451
-/+ buffers/cache:       5563      26498
Swap:        31999       9313      22686
[root@localhost command]# cat mem2.log
             total       used       free     shared    buffers     cached
Mem:         32062       9922      22140          0        906       3451
-/+ buffers/cache:       5563      26498
Swap:        31999       9313      22686

可以看到,mem1.logmem2.log文件都保存了日志。
技巧出处:https://twitter.com/nixcraft/status/163974717311692801

 

第一次北京Golang爱好者聚会小记

昨天参加了第一次北京Golang爱好者聚会(活动可以参考我之前的文章),总体来说办的很成功。讲师们分享的话题很不错,大家提问也很踊跃。最后大家也都拿到了纪念品,很happy!

第一个话题是GolangWeb开发方面的分享以及做的开源项目。我对Web编程不是很懂,但是开源项目演示效果很不错,值得以后关注一下。
第二个话题是使用Golang的经验分享,很详细。尤其是对于Golang新手,值得一听。
第三个话题是对Golang并发编程的经验分享,也不错,对Golang内部机制感兴趣的朋友,可以仔细研究一下。
第四个话题其实和Golang没什么关系,分享了容器技术的一些原理和实现。
第五个话题是介绍用Golang实现的开源项目codis,碰巧我对Redis有一些了解,所以对这一部分最感兴趣,也和讲师讨论了一下。对Redis感兴趣的朋友,可以关注一下这个项目。
最后一个话题是关于OpenAPM的,这个只是泛泛地提了一下,没什么实质性的内容。

我目前对Golang的感觉是:有一些公司开始在用,但短期内可能不会大规模增长。原因如下:
(1)现有的大量系统都是用老牌语言开发的,用Golang重新开发成本太大,风险太高。很多公司不愿冒险;
(2)目前市场上Golang人才毕竟相对较少。一旦有项目组人员流失,短期内有可能会招不到合适的人选;
(3)Golang语言自身的一些因素,比如gc机制,也许也是一个原因。

我不是语言专家,也没资格对任何语言评头论足。我只是建议大家如果感兴趣,可以去看看Golang。其实了解一门语言最大的收获应该是了解它的实现机理,了解它为什么要这样设计,也许这些内容会给我们日常的工作带来一些启迪。

Unix/Linux命令行小技巧(2)- Linux上kill占用某端口的进程

Linux平台上kill占用某端口进程命令:

fuser -k port/tcp(udp)

举个例子:

[root@localhost redis-2.8.19]# ps -ef | grep redis
root     10049 35207  0 17:33 pts/7    00:00:00 ./src/redis-server *:6379
root     10116 35207  0 17:33 pts/7    00:00:00 grep redis             
[root@localhost redis-2.8.19]# fuser -k 6379/tcp
6379/tcp:            10049
[1]+  Killed                  ./src/redis-server

可以看到,占用6379端口的进程被杀死了。
技巧出处:https://twitter.com/nixcraft/status/162914646125330432

Unix/Linux命令行小技巧(1)- 显示运行进程的PID

Bash中定义如下函数(函数参数为程序名):

findpid() { ps axc|awk "{if (\$5==\"$1\") print \$1}"; }

执行效果:

[root@localhost ~]# findpid() { ps axc|awk "{if (\$5==\"$1\") print \$1}"; }
[root@localhost ~]# findpid tail
16049
25206
40701
48132

技巧出处:https://twitter.com/nixcraft/status/158835574508240896

在markdown文件标题输入“#”

由于markdown文件是以“#”作为标题符号的,所以如果标题内容本身包含“#”,就不能直接输出。举个例子,如果标题是“C#”,输入“#C#”的话,效果如下:

C

可以看到“#”没有输出。

解决方式有两种:
(1)利用HTML语法,用“#”表示“#”,即输入“#C#” ;
(2)利用“\”,输入“#C\#”(要注意在“\”和“#”后面有一个空格,否则输出效果为“C\”)。
效果如下:

C#

参考资料:
(1)How to output “#” in title in mardkown file?

在Linux上搭建D语言开发环境

本文介绍如何在Linux上搭建D语言的开发环境:

(1)编译器我选的是gdc,从官方网站下载适合机器的版本,直接解压缩就可以了(不要解压到系统root文件夹:”/“)。为了方便起见,可以把路径加到PATH环境变量:

export PATH=$PWD/x86_64-gdcproject-linux-gnu/bin:$PATH

接下来写个简单的“hello world”程序(hello.d):

import std.stdio;
void main()
{
    writeln("Hello World!");
}  

编译一下:

[root@localhost nan]# gdc hello.d -o hello
/usr/bin/ld: unrecognized option '-plugin'
/usr/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status

这个问题的解决办法是在编译时加上“-fno-use-linker-plugin”选项。再次编译:

[root@localhost nan]# gdc -fno-use-linker-plugin -g hello.d -o hello
[root@localhost nan]# 

成功!
运行一下:

[root@localhost nan]# ./hello
Hello World!

输出了“Hello World!”。

(2)使用gdb进行调试。
示例程序代码如下:

import std.stdio;

void main()
{
    int sum;
    int i;

    for (i = 1; i <= 10; i++)
    {
        sum += i;
    }

    writeln(sum);
}

编译时需要加上“-g”编译选项,产生调试信息:

gdc -fno-use-linker-plugin -g sum.d -o sum

开始调试:

[root@localhost nan]# gdb -q sum
Reading symbols from sum...done.
(gdb) start
Temporary breakpoint 1 at 0x4057bf: file sum.d, line 5.
Starting program: /home/nan/sum
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Temporary breakpoint 1, D main () at sum.d:5
5               int sum;
(gdb) n
6               int i;
(gdb)
8               for (i = 1; i <= 10; i++)
(gdb)
10                      sum += i;
(gdb)
8               for (i = 1; i <= 10; i++)
(gdb) p i
$1 = 1
(gdb) p sum
$2 = 1
(gdb) c
Continuing.
55
[Inferior 1 (process 41619) exited normally]

可以看到,和调试普通的C程序没什么区别。

参考资料:
(1)How to fix “unrecognized option ‘-plugin`” when using gdc to compile D program?
(2)GDC documentation and debugging problems