260 likes | 494 Views
第 6 章 进程管理. 单元目标. ◆ 定义一个进程 ◆ 描述父进程与子进程之间的关系 ◆ 创建和调用shell脚本 ◆ 描述进程监视 ◆ 调用后台进程 ◆ 终止进程 ◆ 列出有用的信号 ◆ 使用nohup命令 ◆ 在ksh下控制jobs. 进程. 进程环境. ◆ 每个程序都会在一个进程中运行: ◆ 变量 $$ 显示了当前shell的进程ID : ◆ ps 命令显示正在运行的进程 : $ echo $$ 4712 $ ps -u team01. Program User and group ID
E N D
单元目标 ◆ 定义一个进程 ◆ 描述父进程与子进程之间的关系 ◆ 创建和调用shell脚本 ◆ 描述进程监视 ◆ 调用后台进程 ◆ 终止进程 ◆ 列出有用的信号 ◆ 使用nohup命令 ◆ 在ksh下控制jobs
进程 进程环境 ◆ 每个程序都会在一个进程中运行: ◆ 变量 $$ 显示了当前shell的进程ID: ◆ ps 命令显示正在运行的进程: $ echo $$ 4712 $ ps -u team01 ProgramUser and group ID DataProcess ID (PID) Open filesParent Process ID (PPID) Current directoryProgram variables
登陆进程环境 AIX 系统 login: PID=202 -ksh login: john John's Password: xxxxxx $ _ 环境 program /usr/bin/ksh uid john gid staff files /dev/tty1 PID 202
进程环境 AIX系统 PID=202 -ksh $ cat kfile PID=310 cat 进程执行期间的环境 • program /usr/bin/cat • uid john • gid staff • files /dev/tty1 • kfile • parent -ksh • PID 310 • PPID 202
父进程与子进程 $ echo $$ 202 $ ksh $ echo $$ 206 $ date Tue Jan 4 11:18:26 GMT 2000 $ <ctrl-d> $ echo $$ 202 • PID PPID • -ksh 202 1 • ksh 206 202 • date 208 206
变量与进程 ◆ 变量是进程环境的一部分. ◆ 进程不能访问或改变另一个进程的变量. $ x=4 $ ksh $ echo $x $ x=1 $ <ctrl-d> $ echo $x 4
导出变量 变量 Subshell Shell export variable=value
shell脚本 shell脚本是存储在一个文本文件里命令的集合 • $ vi hello • echo "Hello, John. Today is: $(date)" • pwd • ls • ~ • ~ • ~ • :wq • $
Shell调用 1 $ cat hello echo "Hello, John. Today is: $(date)" (1) pwd (2) ls (3) $ kshhello Hello, John: Today is: Wed Sep 13 19:34 (1) /home/john (2) books letter1 text2sarah (3) $ _ 子shell $ kshhello -ksh ksh 脚本命令
Shell调用 2 $ cat hello echo "Hello, John. Today is: $(date)" (1) pwd (2) ls (3) $ chmod +x hello $ hello Hello, John: Today is: Wed Sep 13 19:34 (1) /home/john (2) books letter1 text2sarah (3) $ _ 子shell Shell用PATH变量来寻找可执行的文件.
Shell调用 3 $ cat set_dir dir1=/tmp dir2=/usr $ . set_dir $ echo $dir1 /tmp $ echo $dir2 /usr 如果set_dir被调用时没有“.”,dir1和dir2的值是什么?
命令执行结束的退出值 ◆ 命令执行结束时传给父进程一个退出值: 0 = 成功执行 1 - 255 = 非成功执行 ◆ 环境变量 $?内存储着最后一个执行命令的退出值: $cd /etc/security ksh: /etc/security: Permission denied $ echo $? 1
监视进程 ps:显示了进程的状态信息 $ ps -f UID PID PPID ... TTY ... COMMAND john 202 1 ... tty0 ... -ksh john 206 202 ... tty0 ... ksh john 210 206 ... tty0 ... ls -R / john 212 206 ... tty0 ... ps -f
控制进程 $ ls -R / > bigfile $ 前台进程: 后台进程: ksh (wait) ls -R $ ls -R / > bigfile & $ ksh ls -R
终止进程 (1 of 2) ◆ 前台进程: <Ctrl-c>取消一个前台进程 kill有时kill命令用来终止一个前 台进程 ◆ 后台进程: killkill是唯一终止后台进程 的方法
终止进程 (2 of 2) kill命令发送一个信号给进程来终止它 $ ps -f UID PID PPID ... TTY ... COMMAND john 202 1 ... tty0 ... -ksh john 204 202 ... tty0 ... db2_start john 206 202 ... tty0 ... find / $ kill 204 $ kill -9 206
信号 信号 1 2 9 15 意义 挂起----当程序还在运行时用户logout 中断----用户按了中断组合键<Ctrl+c> Kill 信号: 能发送的最强的、也是比较冒险的信该信号不能被阻止或被忽略 终止信号 (默认): 结束进程信号可以被程序处理
耗时长的进程 ◆ 当用户在一个进程尚未完成之前log off时,nohup命令可以阻止进程被kill $ nohup ls -R / > out 2> err.file & [1] 59 $ ◆ 如果你不重定向输出,nohup将会把输出重定向到文件nohup.out中: $ nohup ls -R / & [1] 61 Sending output to nohup.out $
ksh环境下job控制 命令 jobs <Ctrl-z> fg %<jobnumber> bg %jobnumber 作用 列出所有运行在后台的和被停止的进程 暂停前台任务 前台执行job 后台执行job
Job控制实例 $ ls -R / > out 2> errfile & [1] 273 $ jobs [1] + Running ls -R / > out 2> errfile & $ $ fg %1 ls -R / > out 2> errfile <ctrl-z> [1] + Stopped (SIGTSTP) ls -R / > out 2> errfile & $ $ bg %1 $ jobs [1] + Running ls -R / > out 2> errfile & $ $ kill %1 [1] + Terminate ls -R / > out 2> errfile & $
守护进程 守护进程daemon是一个永远不会结束的进程,它控制着系统资源,如打印队列。 队列 file 1 file 2 . . qdaemon 打印机
课堂练习 • 什么时候用“ . ”符号执行一个脚本?为什么? • 什么命令被用来将一个变量导出到子shell? • 下面几步之后x的最后值是多少? $ ( ... login shell ... ) $ ksh $ x=50 $ export x $ <ctrl -d> $ (现在x的值是多少?)
课堂练习 4.ps命令的那个选项可以娴熟用户正在运行的详细命令 ? 5.True or false? 作为一个普通用户,你只能kill自己的进程而不能kill他人的进程 6.哪个信号是可以传给进程来终止它的最强信号? 7.用户总是用nohup命令在后台运行那些运行时间比较长的进程。为什么 8.在UNIX环境中那些特殊的永不结束的的系统进程的名字是什么?
课堂练习答案 • 什么时候用“ . ”符号执行一个脚本?为什么? 当你在当前shell下用脚本改变变量值时使用“.” 2. 什么命令被用来将一个变量导出到子shell? export variable_name 3. 下面几步之后x的最后值是多少? $ ( ... login shell ... ) $ ksh $ x=50 $ export x $ <ctrl -d> $ x依然会取得它在开始子shell前的值。如果login shell没有设置x变量,当子进程结束返回父进程时,x依然没有被设置,还是空值。
课堂练习答案 4. ps命令哪个选项可以显示用户正在运行的命令? ps -f 5.True or false? 作为一个普通用户,你只能kill自己的进程而不能kill他人的进程。 True 6.哪个信号是可以传给进程来终止它的最强信号? signal 9 7.用户总是用nohup命令在后台运行那些运行时间比较长的进程。 在这种情况下job锁住用户的终端并且当用户退出系统时进程继续运行 8.在UNIX环境中那些特殊的永不结束的的系统进程的名字是什么? Daemons