ksh 多进程
2015-10-11 23:10
731 查看
-- Start
当你按回车后,你马上会看到如下输出,1 表示作业号(Job Number),3106 表示进程号(Process ID)。
命令执行完后,会有如下输出。
如果命令执行错误,你会看到如下输出,2 表示错误代码。
你可能想,能不能把一个正在运行的命令放在后台执行呢?答案是肯定的,你需要两步。
第一步,按 CTRL-Z 暂停命令,你会得到如下的输出。
第二步,执行下面的命令把它放在后台执行。
上面的 %1 表示作业号为 1 的作业。我们还可以通过下面的方式引用进程或作业。
如果你想查看当前有哪些进程在后台执行,你可以运行 jobs 命令,如果你想把某个后台命令放在前台执行,试一试 fg %N 吧。
通常,当你退出登录时,你运行的所有命令,不管前台还是后台都会被终止,如果你想让某个命令在你退出登录时继续执行,试一试 disown %N 吧。当然你也可以采用如下的方式运行命令,这样即使你退出登录,也能保证不会被终止。
下面是一些简单的例子。
上面提到的 jobs 命令只能查询到当前 shell 启动的进程,如果你想查看所有的进程,你可以使用 ps 命令。下面是一个简单的例子。
#!/bin/ksh
# 扫描所有的 SQL 语句并运行
for sql in $(ls *.sql)
do
runSQL ${sql};
done
print "done";
由于某些 SQL 需要运行很长时间,导致这个脚本很慢,其实,你可以并发执行所有的 SQL 文件,如下。
-- 更多参见:ksh 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2015-10-12
-- Written by ShangBo on 2015-10-11
-- End
作业控制
当我们在 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) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
下面是一些简单的例子。
# 3106 是进程号,我们也可以通过作业号,命令名引用进程 kill 3106 # 发送 TERM 信号终止进程 kill -15 3106 # 同上 kill -s TERM 3106 # 同上 kill -s INT 3106 # 发送 INT 信号中断进程,同 CTRL-C kill -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)
do
runSQL ${sql};
done
print "done";
由于某些 SQL 需要运行很长时间,导致这个脚本很慢,其实,你可以并发执行所有的 SQL 文件,如下。
#!/bin/ksh function clean { print "received interrupt signal."; # disconnect db and clean tmp file etc exit; } # trap 表示如果收到 INT,TERM 或 QUIT 信号就运行函数 clean trap '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
相关文章推荐
- android wifi 无线调试
- 运维入门
- 动态清空 nohup 输出文件
- install scrapy with pip and easy_install
- Linux Shell常用技巧
- shell字符串操作详解
- Shell中删除某些文件外所有文件的3个方法
- Ruby中执行Linux shell命令的六种方法详解
- VB使用shell函数打开外部exe程序的实现方法
- Shell编程的一些知识集合
- Shell中的for和while循环详细总结
- 什么是Shell?Shell脚本基础知识详细介绍
- Shell脚本中引用、调用另一个脚本文件的2种方法
- Shell脚本解压rpm软件包
- Linux Shell 数组建立及使用技巧
- Shell脚本实现复制文件到多台服务器的代码分享
- Shell脚本实现批量替换文件内容
- Shell脚本实现的一个简易Web服务器例子分享
- linux Shell学习笔记第五天
- Perl 获取shell命令的执行结果