程序之间是可以互相控制的。举例来说,你可以关闭、重新启动服务器软件,服务器软件本身是个程序, 你既然可以让她关闭或启动,当然就是可以控制该程序。
使用kill-l或者是man 7 signal可以查询到有多少个signal。主要的讯号代号与名称对应及内容是:
kill -signal PID
kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。 要再次强调的是: kill 后面直接加数字与加上 %number 的情况是不同的!因为工作控制中有 1 号工作,但是 PID 1 号则是专指“ systemd ”这支程序。
例题:以 ps 找出 rsyslogd 这个程序的 PID 后,再使用 kill 传送讯息,使得 rsyslogd 可以重新读取配置文件。答:由于需要重新读取配置文件,因此 signal 是 1 号。至于找出 rsyslogd的 PID 可以是这样做:
ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}'
接下来则是实际使用 kill -1 PID,因此,整串指令会是这样:
kill -SIGHUP $(ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}')
如果要确认有没有重新启动 syslog ,可以参考登录文件的内容,使用如下指令查阅:
tail -5 /var/log/messages
如果你有看到类似“Aug 5 01:25:02 study rsyslogd: [origin software="rsyslogd"swVersion="7.4.7" x-pid="742" x-info="The rocket-fast Syslog Server - rsyslog"] rsyslogd was HUPed”之类的字样,就是表示 rsyslogd 在 8/5 有重新启动 (restart) 过了。
如果未来你想要将某个莫名其妙的登陆者的连线删除的话,就可以通过使用 pstree -p 找到相关程序, 然后再以 kill -9 将该程序删除,该条连线就会被踢掉了。
killall -signal 指令名称
由于 kill 后面必须要加上 PID (或者是 job number),所以,通常 kill 都会配合 ps, pstree 等指令,因为我们必须要找到相对应的那个程序的 ID。举例说,可以用killall直接将rsyslogd这个程序给予一个SIGHUP 的讯号。
总之,要删除某个程序,我们可以使用 PID 或者是启动该程序的指令名称,用killall可以删除某个服务。 因为他可以将系统当中所有以某个指令名称启动的程序全部删除。
16.3.3 关于程序的执行顺序
Linux 是多用户多任务的环境,系统同时间有非常多的程序在运行中,只是绝大部分的程序都在休眠 (sleeping) 状态而已。
CPU 调度指的是每支程序被 CPU 运行的演算规则, 而例行性工作调度则是将某支程序安排在某个时间再交由系统执行。 CPU调度与操作系统较具有相关性!
Priority 与 Nice 值
CPU 一秒钟可以运行多达数 G 的微指令次数,通过核心的 CPU 调度可以让各程序被 CPU 所切换运行, 因此每个程序在一秒钟内或多或少都会被 CPU 执行部分的指令码。如果程序都是集中在一个伫列中等待 CPU 的运行, 而不具有优先顺序之分,也就是像我们去游乐场玩热门游戏需要排队一样,每个人都是照顺序来。
图16.3.1、并没有优先顺序的程序伫列示意图