ksh 多进程

来源:互联网 发布:海岛奇兵导弹数据 编辑:程序博客网 时间:2024/05/21 02:53

-- Start

作业控制

当我们在 ksh 中执行一条命令时,在命令结束之前,我们能做的只有等待,如果命令需要运行很长时间,在这段时间内你还想干点别的,你可以通过下面的方式运行命令。

#!/bin/ksh# 在命令的末尾加上 & 表示在后台执行该命令ls > /dev/null &

当你按回车后,你马上会看到如下输出,1 表示作业号(Job Number),3106 表示进程号(Process ID)。

[1] 3106

命令执行完后,会有如下输出。

[1]+  Done                    ls --color=auto > /dev/null

如果命令执行错误,你会看到如下输出,2 表示错误代码。

[1]+  Exit 2                  ls --color=auto dd /dev/null

你可能想,能不能把一个正在运行的命令放在后台执行呢?答案是肯定的,你需要两步。

第一步,按 CTRL-Z 暂停命令,你会得到如下的输出。

[1]+  Stopped                 vi test.txt

第二步,执行下面的命令把它放在后台执行。

bg %1

上面的 %1 表示作业号为 1 的作业。我们还可以通过下面的方式引用进程或作业。

引用        进程N           进程号 N-N          进程组号 N%N          作业号 N%string    以 string 开头的命令%?string    包含 string 的命令%+或%%      最后被调用的命令%-          倒数第二被调用的命令

如果你想查看当前有哪些进程在后台执行,你可以运行 jobs 命令,如果你想把某个后台命令放在前台执行,试一试 fg %N 吧。

通常,当你退出登录时,你运行的所有命令,不管前台还是后台都会被终止,如果你想让某个命令在你退出登录时继续执行,试一试 disown %N 吧。当然你也可以采用如下的方式运行命令,这样即使你退出登录,也能保证不会被终止。

nohup ls > /dev/null &


进程管理

很多人认为 kill 命令就是用来杀掉进程的,其实它是用来给进程发送信号(Signal)的,我们可以给进程发送哪些信号呢?试一试下面的命令吧。

kill -l结果如下: 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR111) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) SIGRTMAX-1  64) SIGRTMAX

下面是一些简单的例子。 

# 3106 是进程号,我们也可以通过作业号,命令名引用进程kill 3106 # 发送 TERM 信号终止进程kill -15 3106 # 同上kill -s TERM 3106 # 同上kill -s INT 3106 # 发送 INT 信号中断进程,同 CTRL-Ckill -s QUIT 3106 # 发送 QUIT 信号退出进程kill -s KILL 3106 # 发送 KILL 信号杀死进程

上面提到的 jobs 命令只能查询到当前 shell 启动的进程,如果你想查看所有的进程,你可以使用 ps 命令。下面是一个简单的例子。

ps -ef | grep 'vi test.txt' | grep -v grep

多进程

假设某个目录下有好多 SQL 文件,现在让你把它们都运行一遍,你可以采用如下的脚本。

#!/bin/ksh  # 扫描所有的 SQL 语句并运行for sql in $(ls *.sql)dorunSQL ${sql};doneprint "done";

由于某些 SQL 需要运行很长时间,导致这个脚本很慢,其实,你可以并发执行所有的 SQL 文件,如下。


#!/bin/kshfunction clean {print "received interrupt signal.";# disconnect db and clean tmp file etcexit;}# trap 表示如果收到 INT,TERM 或  QUIT 信号就运行函数 cleantrap 'clean' INT TERM QUIT# 扫描所有的 SQL 语句并运行for sql in $(ls *.sql)do# 在后台运行 SQL 语句runSQL ${sql} &;done# wait 命令等待所有后台命令执行完毕wait;print "done";


-- 更多参见:ksh 精萃

-- 声 明:转载请注明出处

-- Last Updated on 2015-10-12
-- Written by ShangBo on 2015-10-11
-- End


0 0
原创粉丝点击