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
- ksh 多进程
- 监控进程运行 KSH
- ksh
- ksh
- ksh学习
- ksh basic
- Ksh版本
- ksh(一)
- ksh 学习
- 回归ksh
- ksh 案例
- KSH 语法
- mp1_update_oracle.ksh
- KSH入门
- 继续ksh
- KSH 语法
- SubmitetoHermes.ksh
- ksh learn
- java 中StringBuffer类(或者StringBuilder)和String的区别
- WIN7 64 安装串口驱动和mini2440USB驱动
- MySQL索引背后的数据结构及算法原理
- 如何测试一个用户登录界面
- 【经典算法】:基于中文字符分析的统计频率算法实现
- ksh 多进程
- J2EE学习篇之--JDBC详解
- java遍历arrayList的四种方法
- VC/MFC 进程间通信方法总结
- linux文件属性
- 黑马程序员——java高新技术之反射
- js学习笔记_闭包
- 背包问题3:多重背包问题
- Logback config