当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 进程操作

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:38

rap "rm $pidfile" 0更多实现策略自己尽情发挥吧!调整进程的优先级在保证每个进程都能够顺利执行外,为了让某些任务优先完成,那么系统在进行进程调度时就会采用一定的调度办法,比如常见的有按照优先级的时间片轮转的调度算法。这种情况下,可以通过 renice 调整正在运行的程序的优先级,例如:`范例:获取进程优先级$ ps -e -o "%p %c %n" | grep xfs 5089 xfs 0范例:调整进程的优先级$ renice 1 -p 5089renice: 5089: setpriority: Operation not permitted$ sudo renice 1 -p 5089 #需要权限才行[sudo] password for falcon:5089: old priority 0, new priority 1$ ps -e -o "%p %c %n" | grep xfs #再看看,优先级已经被调整过来了 5089 xfs 1结束进程既然可以通过命令行执行程序,创建进程,那么也有办法结束它。可以通过 kill 命令给用户自己启动的进程发送某个信号让进程终止,当然“万能”的 root 几乎可以 kill 所有进程(除了 init 之外)。例如,范例:结束进程$ sleep 50 & #启动一个进程[1] 11347$ kill 11347kill 命令默认会发送终止信号( SIGTERM )给程序,让程序退出,但是 kill 还可以发送其他信号,这些信号的定义可以通过 man 7 signal 查看到,也可以通过 kill -l 列出来。$ man 7 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) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX范例:暂停某个进程例如,用 kill 命令发送 SIGSTOP 信号给某个程序,让它暂停,然后发送 SIGCONT 信号让它继续运行。$ sleep 50 &[1] 11441$ jobs[1]+ Running sleep 50 &$ kill -s SIGSTOP 11441 #这个等同于我们对一个前台进程执行CTRL+Z操作$ jobs[1]+ Stopped sleep 50$ kill -s SIGCONT 11441 #这个等同于之前我们使用bg %1操作让一个后台进程运行起来$ jobs[1]+ Running sleep 50 &$ kill %1 #在当前会话(session)下,也可以通过作业号控制进程$ jobs[1]+ Terminated sleep 50可见 kill 命令提供了非常好的功能,不过它只能根据进程的 ID 或者作业来控制进程,而 pkill 和 killall 提供了更多选择,它们扩展了通过程序名甚至是进程的用户名来控制进程的方法。更多用法请参考它们的手册。范例:查看进程退出状态当程序退出后,如何判断这个程序是正常退出还是异常退出呢?还记得 Linux 下,那个经典 hello world 程序吗?在代码的最后总是有条 return 0 语句。这个 return 0 实际上是让程序员来检查进程是否正常退出的。如果进程返回了一个其他的数值,那么可以肯定地说这个进程异常退出了,因为它都没有执行到 return 0 这条语句就退出了。那怎么检查进程退出的状态,即那个返回的数值呢?在 Shell 中,可以检查这个特殊的变量 $?,它存放了上一条命令执行后的退出状态。$ test1bash: test1: command not found$ echo $?127$ cat ./test.c | grep hello$ echo $?1$ cat ./test.c | grep hi printf("hi, myself!\n");$ echo $?0貌似返回 0 成为了一个潜规则,虽然没有标准明确规定,不过当程序正常返回时,总是可以从 $? 中检测到 0,但是异常时,总是检测到一个非 0 值。这就告诉我们在程序的最后最好是跟上一个 exit 0 以便任何人都可以通过检测 $? 确定程序是否正常结束。如果有一天,有人偶尔用到你的程序,试图检查它的退出状态,而你却在程序的末尾莫名地返回了一个 -1 或者 1,那么他将会很苦恼,会怀疑他自己编写的程序到底哪个地方出了问题,检查半天却不知所措,因为他太信任你了,竟然从头至尾都没有怀疑你的编程习惯可能会与众不同!进程通信为便于设计和实现,通常一个大型的任务都被划分成较小的模块。不同模块之间启动后成为进程,它们之间如何通信以便交互数据,协同工作呢?在《UNIX 环境高级编程》一书中提到很多方法,诸如管道(无名管道和有名管道)、信号(signal)、报文(Message)队列(消息队列)、共享内存(mmap/munmap)、信号量(semaphore,主要是同步用,进程之间,进程的不同线程之间)、套接口(Socket,支持不同机器之间的进程通信)等,而在 Shell 中,通常直接用到的就有管道和信号等。下面主要介绍管道和信号机制在 Shell 编程时的一些用法。范例:无名管道(pipe)在 Linux 下,可以通过 | 连接两个程序,这样就可以用它来连接后一个程序的输入和前一个程序的输出,因此被形象地叫做个管道。在 C 语言中,创建无名管道非常简单方便,用 pipe 函数,传入一个具有两个元素的 int 型的数组就可以。这个数组实际上保存的是两个文件描述符,父进程往第一个文件描述符里头写入东西后,子进程可以从第一个文件描述符中读出来。如果用多了命令行,这个管子 | 应该会经常用。比如上面有个演示把 ps 命令的输出作为 grep 命令的输入:$ ps -ef | grep init也许会觉得这个“管子”好有魔法,竟然真地能够链接两个程序的输入和输出,它们到底是怎么实现的呢?实际上当输入这样一组命令时,当前 Shell 会进行适当的解析,把前面一个进程的输出关联到管道的输出文件描述符,把后面一个

上一页  [1] [2] [3] [4]  下一页


Shell 进程操作