怎么把一个普通的进程挂入Supervisor监控树

作者&投稿:御盲 (若有异议请与网页底部的电邮联系)
怎么把一个普通的进程挂入Supervisor监控树~

1. 安装supervisorsupervisor本身是python实现的,而且是调研阶段,故先创建一个新的virtualenv环境,然后用pip安装好supervisor包。至此,基本的调研环境搭建完毕。当然,php-fpm和PHP环境以及前端的Nginx是早就ready的。2. 分析php-fpm.sh脚本通常编译安装PHP后,php-fpm这个2进制的C程序也会被编译并安装好,典型路径在php_install_path/sbin/目录下。该目录下还有个名为php-fpm.sh的脚本用于控制php-fpm进程的start/stop/restart/reload等动作。./sbin/php-fpm.sh脚本中,”start”操作启动了php-fpm主进程,其余的操作都是通过向php-fpm master进程发signal实现的。

Supervisor是一个C/S系统,它允许用户在类UNIX系统上控制一些进程。它具有以下特性:
1 简单
Supervisor通过INI格式配置文件进行配置,很容易掌握,它为每个进程提供了很多配置选项,可以使你很容易的重启进程或者自动的轮转日志。
2 统一
Supervisor提供了一种统一的方式来start、stop、monitor你的进程, 进程可以单独控制,也可以成组的控制。你可以在本地或者远程命令行或者web接口来配置Supervisor。
3 有效
Supervisor通过fork/exec启动它的子进程,子进程并不是守护进程。当一个进程终止的时候,操作系统会立即给Supervisor发送一个信号,而不是像其他解决方案依赖PID文件。
4 可扩展
Supervisor包含一个简单的事件通知协议,因此任何程序都可以监控它,而且提供一个XML-RPC控制接口。
5 兼容
除了windows平台,其他平台都可运行。
Supervisor系统的组件:
supervisord:
服务会启动supervisord服务,它负责调用自己启动子程序,响应来自客户端的命令,重启crash或者退出的进程,记录进程的输出信息,收集事件信息。该服务的配置文件在/etc/supervisor/supervisord.conf
supervisorctl:
客户端的命令行工具,提供一个类shell接口,通过它你可以连接到不同的supervisord进程上来管理它们各自的子程序。客户端命令通过UNIX socket或者TCP来和服务通讯,服务端可以要求客户端提供身份验证之后才能进行操作([supervisorctl])。
Web Server:
一个小的web接口被集成进了supervisorctl,重启supervisord之后就可以访问了([inet_http_server])。
XML-RPC Interface:
就像HTTP提供WEB UI一样,同时还提供了XML-RPC接口来控制supervisor和由它运行的程序。
安装:
supervisor是python编写的,显然用easy_install、pip都可以安装,我懒,直接apt-get了,在ubuntu14.04下安装完后版本是3.0b2。
Supervisor服务的启动
其实启动Supervisor很简单,supervisord -h看看就知道了,最简单的-c根配置文件即可:

复制代码
代码如下:

supervisord -- run a set of applications as daemons.

Usage: /usr/bin/supervisord [options]

Options:
-c/--configuration FILENAME -- configuration file
-n/--nodaemon -- run in the foreground (same as 'nodaemon true' in config file)
-h/--help -- print this usage message and exit
-v/--version -- print supervisord version number and exit
-u/--user USER -- run supervisord as this user (or numeric uid)
-m/--umask UMASK -- use this umask for daemon subprocess (default is 022)
-d/--directory DIRECTORY -- directory to chdir to when daemonized
-l/--logfile FILENAME -- use FILENAME as logfile path
-y/--logfile_maxbytes BYTES -- use BYTES to limit the max size of logfile
-z/--logfile_backups NUM -- number of backups to keep when max bytes reached
-e/--loglevel LEVEL -- use LEVEL as log level (debug,info,warn,error,critical)
-j/--pidfile FILENAME -- write a pid file for the daemon process to FILENAME
-i/--identifier STR -- identifier used for this instance of supervisord
-q/--childlogdir DIRECTORY -- the log directory for child process logs
-k/--nocleanup -- prevent the process from performing cleanup (removal of
old automatic child log files) at startup.
-a/--minfds NUM -- the minimum number of file descriptors for start success
-t/--strip_ansi -- strip ansi escape codes from process output
--minprocs NUM -- the minimum number of processes available for start success
--profile_options OPTIONS -- run supervisord under profiler and output
results based on OPTIONS, which is a comma-sep'd
list of 'cumulative', 'calls', and/or 'callers',
e.g. 'cumulative,callers')
不过既然我这懒人是用apt-get安装的,那安装包的规范必然符合debian系的风格了,直接service supervisor start即可启动,且慢,我们还没配置supervisor的配置文件呢,启动了也没什么效果。我们后面详解配置文件的配置。

supervisorctl客户端的使用
supervisorctl有两种模式,一种是交互模式,一种是命令行模式。在命令行输入supervisorctl直接回车,即可进入交互模式。

复制代码
代码如下:

supervisorctl -- control applications run by supervisord from the cmd line.

Usage: /usr/bin/supervisorctl [options] [action [arguments]]

Options:
-c/--configuration -- configuration file path (default /etc/supervisor.conf)
-h/--help -- print usage message and exit
-i/--interactive -- start an interactive shell after executing commands
-s/--serverurl URL -- URL on which supervisord server is listening
(default "http://localhost:9001").
-u/--username -- username to use for authentication with server
-p/--password -- password to use for authentication with server
-r/--history-file -- keep a readline history (if readline is available)

复制代码
代码如下:

action [arguments] -- see below

Actions are commands like "tail" or "stop". If -i is specified or no action is
specified on the command line, a "shell" interpreting actions typed
interactively is started. Use the action "help" to find out about available
actions.
Supervisor的开机自启动

如果你是pip或者easy_install安装的,开机服务自启动还真是个麻烦事,不过官方已经给出一些rc.d脚本示例了,在github上,不过由于我是apt-get安装的,显然这个开机自启动是不用担心的,用debian的update-rc.d即可搞定。
Supervisor的进程安全
既然是用Supervisor来保证其他进程的正常运行,但是万一Supervisor进程挂了怎么办,我们可以使用daemontools来保证Supervisor正常运行,就类似于监控的监控。
supervisord的配置文件主要由几个配置段构成,配置项以K/V格式呈现,下面就看看各个配置端需要怎样配置:
[unix_http_server]
在该配置块的参数项表示的是一个监听在socket上的HTTP server,如果[unix_http_server]块不在配置文件中,则不会启动基于socket的HTTP server。
file:一个unix domain socket的文件路径,HTTP/XML-RPC会监听在这上面
chmod:在启动时修改unix domain socket的mode
chown:修改socket文件的属主
username:HTTP server在认证时的用户名
password:认证密码
eg:

复制代码
代码如下:

[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup
username = user
password = 123
[inet_http_server]

在该配置块的参数项表示的是一个监听在TCP上的HTTP server,如果[inet_http_server]块不在配置文件中,则不会启动基于TCP的HTTP server。

port:TCP监听的地址和端口(ip:port),这个地址会被HTTP/XML-RPC监听
username:HTTP server在认证时的用户名
password:认证密码
eg:

复制代码
代码如下:

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123
[supervisord]

该配置块的参数项是关于supervisord进程的全局配置项。
logfile:log文件路径
logfile_maxbytes:log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
logfile_backups:轮转日志备份的数量,默认是10,如果设置为0,则不备份
loglevel:error、warn、info、debug、trace、blather、critical
pidfile:pid文件路径
umask:umask值,默认022
nodaemon:如果设置为true,则supervisord在前台启动,而不是以守护进程启动
minfds:supervisord在成功启动前可用的最小文件描述符数量,默认1024
minprocs:supervisord在成功启动前可用的最小进程描述符数量,默认200
nocleanup:防止supervisord在启动的时候清除已经存在的子进程日志文件
childlogdir:自动启动的子进程的日志目录
user:supervisord的运行用户
directory:supervisord以守护进程运行的时候切换到这个目录
strip_ansi:消除子进程日志文件中的转义序列
environment:一个k/v对的list列表
eg:

复制代码
代码如下:

[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid
nodaemon = false
minfds = 1024
minprocs = 200
umask = 022
user = chrism
identifier = supervisor
directory = /tmp
nocleanup = true
childlogdir = /tmp
strip_ansi = false
environment = KEY1="value1",KEY2="value2"
[supervisorctl]

该配置块参数是关于supervisorctl

serverurl:这个url是用来访问supervisord服务的(http://localhost:9001),或者是个sockets文件(unix:///absolute/path/to/file.sock)
username:supervisorctl连接supervisord的认证用户
password:认证密码
prompt:默认是supervisor
history_file:history文件路径
eg:

复制代码
代码如下:

[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
username = chris
password = 123
prompt = mysupervisor
[program:x]

该配置块包含一个或者多个program段,program来表明supervisord要控制哪些程序。该配置块的头部是有固定格式的,一个关键字program,后面跟着一个冒号,接下来才是程序名。例如:[program:foo],foo就是程序名,在使用supervisorctl来操作程序的时候,就是以foo来标明的。

command:启动程序使用的命令,可以是绝对路径或者相对路径
process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s
numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1
numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值
priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999
autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。
autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。
startsecs:程序启动后等待多长时间后才认为程序启动成功
startretries:supervisord尝试启动一个程序时尝试的次数。默认是3
exitcodes:一个预期的退出返回码,默认是0,2。
stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间
stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组
killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。
user:如果supervisord以root运行,则会使用这个设置用户启动子程序
redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。
stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。
stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份
stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true
stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份
stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
environment:一个k/v对的list列表
directory:supervisord在生成子进程的时候会切换到该目录
umask:设置进程的umask
serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url

简单来说:应该是在调用的start_link返回一个{ok,Pid}就可以把这个进程放入监控树Supervisor里面:

view sourceprint?
01.
-module(worker).
02.
-author("zhongwencool@gmail.com").
03.

04.
-export([start_link/0,stop_worker/0]).
05.

06.
start_link() –>
07.
{ok,spawn(fun() -> loop() end)}.
08.

09.
loop() –>
10.
case whereis(?MODULE) of
11.
undefined –>
12.
io:format("worker restart~n"),
13.
erlang:register(?MODULE,self());
14.
_ -> ok
15.
end,
16.
receive
17.
stop –>
18.
io:format("Worker Stop~n");
19.
Msg –>
20.
io:format("RECV:~w~n",[Msg]),
21.
loop()
22.
end.
23.

24.
stop_worker() –>
25.
erlang:send(?MODULE,stop).
这个和gen_server的区别在于,得不到很多如gen_server的行为保证(guarantees),比如gen_sever与supervisor的特性:只有init/1返回后才会返回{ok,Pid},如果你用spawn/1就是异步,无此特性了。

那么如果,你还是觉得gen_server放在你的需求中有点大材小用,要自己造一个更加轻量的进程,又想拥有类似于gen_server的特性,怎么办呢?

你可以参照OTP Design Principles: http://www.erlang.org/doc/design_principles/spec_proc.html#id72814

简单地说就是:使用sys,proce_lib使进程符合:Supervision tree.

6.2 Special Processes
这部分描述了怎么写一个不使用标准行为(gen_server,gen_fsm,gen_event)模板,写一个完全符合OTP 设计原则的进程要做到那些点:

view sourceprint?
1.
1. 这个进程必须能被加入监控树;
2.
2. 支持 Debug Facilities
3.
3. 支持System Messages.
系统信息(System message )是在监控树里面使用的一种特殊信息,典型特性:支持trace output; 支持suspend or resume process execution(在版本更新时使用);标准的行为包(如gen_server)是自动支持这些特性的。

例子:
view sourceprint?
1.
请看从 Overview 章节拿来来的简单例子:使用sys,proce_lib使进程符合:Supervision tree.
view sourceprint?
01.
-module(ch4).
02.
-export([start_link/0]).
03.
-export([alloc/0, free/1]).
04.
-export([init/1]).
05.
-export([system_continue/3, system_terminate/4,
06.
write_debug/3,
07.
system_get_state/1, system_replace_state/2]).
08.

09.
start_link() ->
10.
proc_lib:start_link(ch4, init, [self()]).
11.

12.
alloc() ->
13.
ch4 ! {self(), alloc},
14.
receive
15.
{ch4, Res} ->
16.
Res
17.
end.
18.

19.
free(Ch) ->
20.
ch4 ! {free, Ch},
21.
ok.
22.

23.
init(Parent) ->
24.
register(ch4, self()),
25.
Chs = channels(),
26.
Deb = sys:debug_options([]),
27.
proc_lib:init_ack(Parent, {ok, self()}),
28.
loop(Chs, Parent, Deb).
29.

30.
loop(Chs, Parent, Deb) ->
31.
receive
32.
{From, alloc} ->
33.
Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
34.
ch4, {in, alloc, From}),
35.
{Ch, Chs2} = alloc(Chs),
36.
From ! {ch4, Ch},
37.
Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
38.
ch4, {out, {ch4, Ch}, From}),
39.
loop(Chs2, Parent, Deb3);
40.
{free, Ch} ->
41.
Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
42.
ch4, {in, {free, Ch}}),
43.
Chs2 = free(Ch, Chs),
44.
loop(Chs2, Parent, Deb2);
45.

46.
{system, From, Request} ->
47.
sys:handle_system_msg(Request, From, Parent,
48.
ch4, Deb, Chs)
49.
end.
50.

51.
system_continue(Parent, Deb, Chs) ->
52.
loop(Chs, Parent, Deb).
53.

54.
system_terminate(Reason, _Parent, _Deb, _Chs) ->
55.
exit(Reason).
56.

57.
system_get_state(Chs) ->
58.
{ok, Chs}.
59.

60.
system_replace_state(StateFun, Chs) ->
61.
NChs = StateFun(Chs),
62.
{ok, NChs, NChs}.
63.

64.
write_debug(Dev, Event, Name) ->
65.
io:format(Dev, "~p event = ~p~n", [Name, Event]).
如何使用以上的sys和ch4模块呢?
view sourceprint?
01.
% erl
02.
Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]
03.

04.
Eshell V5.2.3.6 (abort with ^G)
05.
1> ch4:start_link().
06.
{ok,<0.30.0>}
07.
2> sys:statistics(ch4, true).
08.
ok
09.
3> sys:trace(ch4, true).
10.
ok
11.
4> ch4:alloc().
12.
ch4 event = {in,alloc,<0.25.0>}
13.
ch4 event = {out,{ch4,ch3},<0.25.0>}
14.
ch3
15.
5> ch4:free(ch3).
16.
ch4 event = {in,{free,ch3}}
17.
ok
18.
6> sys:statistics(ch4, get).
19.
{ok,[{start_time,{{2003,6,13},{9,47,5}}},
20.
{current_time,{{2003,6,13},{9,47,56}}},
21.
{reductions,109},
22.
{messages_in,2},
23.
{messages_out,1}]}
24.
7> sys:statistics(ch4, false).
25.
ok
26.
8> sys:trace(ch4, false).
27.
ok
28.
9> sys:get_status(ch4).
29.
{status,<0.30.0>,
30.
{module,ch4},
31.
[[{'$ancestors',[<0.25.0>]},{'$initial_call',{ch4,init,[<0.25.0>]}}],
32.
running,<0.25.0>,[],
33.
[ch3,ch4,ch3]]}
启动进程要做的事:
必须使用proc_lib模块的函数来启动进程,这里有几个可能用到的函数,例如:spawn_link/3,4用于异步启动,start_link/3,4,5用于同步启动(和刚才说的要等init/1返回才能再继续一个原理),

使用proc_lib函数启动的进程会把监控树所要的进程信息(继承关系ancestors,初始华调用initial call等)都保存下来;

并且,当进程被异常(不是normal or shutdown)终结时,会生成相应的崩溃报告(crash report),你可以查看SASL User’s Guide来得到。

在上面这个ch4的例子中,使用的是同步启动(和gen_server一样),这个进程启动时调用ch4:start_link():

view sourceprint?
1.
start_link() ->
2.
proc_lib:start_link(ch4, init, [self()]).
ch4:start_link 调用proc_lib:start_link. 这个函数使用模块明,函数名和一个参数列表来创建(spawns)一个新的进程并links它.新的进程会调用ch4:init(Pid), Pid就是父进程传进来的self().

在初始华时,所有的初始化(包括注册名字)都会完成,初始化完成时必须要通知父进程已完成:

view sourceprint?
1.
init(Parent) ->
2.
...
3.
proc_lib:init_ack(Parent, {ok, self()}),
4.
loop(...).
注意:proc_lib:start_link 是同步创建,它会一直等待子进程用 proc_lib:init_ack 返回; 异步创建请用proce_lib:spawn_link.

Debugging
我们需要用一个debug 结构(通过sys:debug_options/1初始化得到的term结构)使用sys模块支持Debug

view sourceprint?
1.
init(Parent) ->
2.
...
3.
Deb = sys:debug_options([]),
4.
...
5.
loop(Chs, Parent, Deb).
sys:debug_options/1 返回一个选择列表(list of options),在这里面是一个空列表,代表没有debugging在初始化时建立,你可以通过sys(3)查看其它可能的选项。

使用以下函数来记录(logged)或跟踪(traced)每一个我们想要的system event:

view sourceprint?
1.
sys:handle_debug(Deb, Func, Info, Event) => Deb1
Deb 就是在上面被sys:debug_options/1 初始华的debug结构

Func 是用户自己定义用于跟踪输出的函数,对于每一个system event,都会调用 Func(Dev, Event, Info),
Dev是标准IO设备用于输入,可以查看io(3).

Event 和 Info由 handle_debug得到.
Info 可以是任意term 来代表其它附加的信息传给Func.

Event 是system event,这取决于用户怎么去定义system event,但是典型至少包括那些进出的消息(incoming and outgoing message),就像这样的结构{in Msg,[,From]} ,{out,Msg,To}.

handle_debug 返回一个更新的debug structure((Deb1).

在这个例子中,handle_debug会被所有的进出消息调用,每个消息的处理会调用ch4:write_debug/3 :

view sourceprint?
01.
loop(Chs, Parent, Deb) ->
02.
receive
03.
{From, alloc} ->
04.
Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
05.
ch4, {in, alloc, From}),
06.
{Ch, Chs2} = alloc(Chs),
07.
From ! {ch4, Ch},
08.
Deb3 = sys:handle_debug(Deb2, fun ch4:write_debug/3,
09.
ch4, {out, {ch4, Ch}, From}),
10.
loop(Chs2, Parent, Deb3);
11.
{free, Ch} ->
12.
Deb2 = sys:handle_debug(Deb, fun ch4:write_debug/3,
13.
ch4, {in, {free, Ch}}),
14.
Chs2 = free(Ch, Chs),
15.
loop(Chs2, Parent, Deb2);
16.
...
17.
end.
18.

19.
write_debug(Dev, Event, Name) ->
20.
io:format(Dev, "~p event = ~p~n", [Name, Event]).
Handling System Messages
收到的系统消息格式如下:

view sourceprint?
1.
{system, From, Request}
这些消息不会打扰到进程,会被自动调用以下的函数处理:

The content and meaning of these messages do not need to be interpreted by the process. Instead the following function should be called:

view sourceprint?
1.
sys:handle_system_msg(Request, From, Parent, Module, Deb, State)
这个函数不会返回,它会处理完system message 后再调用以下函数来继续这个进程:

view sourceprint?
1.
Module:system_continue(Parent, Deb, State)
也可以调用以下函数来终结这个进程:

view sourceprint?
1.
Module:system_terminate(Reason, Parent, Deb, State)
如果进程应该被终结,那么监控树里的一个监控进程也会以相同的原因终结掉。

Request 和From 要从system message 中得到,再用于handle_system_msg; Parent 是父进程的PID; Module 代表的是模块名; Deb 是一个debug结构; State 是用于描述内部state糊状的term,通过system_continue/system_terminate/ system_get_state/system_replace_state来得到。
如果进程想返回它的类型(类于gen_server:call返回),就使用:

view sourceprint?
1.
Module:system_get_state(State)
或者进程只需要更新StateFunc :

view sourceprint?
1.
Module:system_replace_state(StateFun, State)
view sourceprint?
1.

view sourceprint?
1.
在上面的例子中:
view sourceprint?
01.
loop(Chs, Parent, Deb) ->
02.
receive
03.
...
04.

05.
{system, From, Request} ->
06.
sys:handle_system_msg(Request, From, Parent,
07.
ch4, Deb, Chs)
08.
end.
09.

10.
system_continue(Parent, Deb, Chs) ->
11.
loop(Chs, Parent, Deb).
12.

13.
system_terminate(Reason, Parent, Deb, Chs) ->
14.
exit(Reason).
15.

16.
system_get_state(Chs) ->
17.
{ok, Chs, Chs}.
18.

19.
system_replace_state(StateFun, Chs) ->
20.
NChs = StateFun(Chs),
21.
{ok, NChs, NChs}.
如果进程想要设置trap exits,来让进程在终结时调用terminates 那么调用以下会发 {'EXIT', Parent, Reason}处理:

view sourceprint?
01.
init(...) ->
02.
...,
03.
process_flag(trap_exit, true),
04.
...,
05.
loop(...).
06.

07.
loop(...) ->
08.
receive
09.
...
10.

11.
{'EXIT', Parent, Reason} ->
12.
..maybe some cleaning up here..
13.
exit(Reason);
14.
...
15.
end.<br><br><br>


windows进程全解
Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位在系统的%systemroot%\\system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置来构建需要加载的服务列表。这就会使多个Svchost.exe在同一时间运行。每个Svchost.exe的回话期间都包含一组服务,以至于单独的服务必须...

用java实现一个模拟操作系统内核运行的程序。(1)进程控制:其中包括进程...
从启动其他程序的Java进程看,已启动的其他程序输出就是一个普通的输入流,可以通过getInputStream()和getErrorStream来获取。 对于一般输出文本的进程来说,可以将InputStream封装成BufferedReader,然后就可以一行一行的对进程的标准输出进行处理。 4、举例 (1)Runtime.exec() import java.io.BufferedReader;import java....

宏基笔记本进程太多怎么办,WIN7家庭普通版的,哪些能关哪些不能关?_百...
而且利用系统软件进入进程管理时候软件会给予关闭进程建议,带有acer的进程一般是本子的一些快捷键进程,一般保留不碍事。主要是安装软件的一些强起控件,一般把开机启动项都拿掉,再照着管理软件的建议优化一下,就会清爽很多了~我用的是windows优化大师老旧版,不升级功能足够用,开机进程数不到20。

在时间片轮转调度中,如果一个进程在一个时间片内就已经运行结束,那剩...
priority是进程(包括实时和普通)的静态优先级。counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此,counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。

如何让一个应用程序一直在后台运行
就是调用系统的API启动一个前台Service进程,这样会在通知栏生成一个Notification,用户知道哪些进程正在运行 4 灰色保活 1 保活领域应用最为广泛,利用系统的漏洞来启动一个前台的Service进程,与“白色保活”不同的是,它不会在通知栏生成一个Notification,用户无法察觉,但是优先级要高于普通的后台进程。2...

以下几个进程的作用是什么?
介绍:Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位在系统的%systemroot%\\system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置来构建需要加载的服务列表。这就会使多个Svchost.exe在同一时间运行。每个Svchost.exe的回话期间都包含一组服务,以至于单独的服务...

svchost.exe是什么进程啊?
Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svchost.exe文件定位在系统的%systemroot%\\system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置(HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost)来构建需要加载的服务列表。这就会使多个Svchost.exe在同一...

任务管理器中进程
UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务) msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务) 详细说明: win2k运行进程 Svchost.exe Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位 在系统的%systemroot%\\system32文件夹...

我电脑的一个进程system idle process长时间的cpu使用率98%?求解...
system idle ……是表示你系统剩余的CPU资源! 不要想去结束它!要是他占的CPU资源为0估计你该重新启动了 Service Host Process是一个标准的动态连接库主机处理服务。Svchost.exe对那些从动态连接库(DLL)中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位在系统的Windows\\system32文件夹下...

我家电脑少了一个进程,一关闭我的电脑文件夹什么的就会卡住 怎么回事...
6、查看“ svchost ”进程。 svchost . exe 是Windows XP系统 的一个核心进程。 svchost.exe 不单单只出现 在Window s XP中,在使用 NT 内核的 Windows系统 中都会有svchost.exe的存在。一般在 Windows 2000 中 svchost.exe进程 的数目为2个,而在Windows XP中svchost.exe进程的数目就上升到了4个及4个以上。

蚌山区15167479847: linux中怎样创建一个挂起进程? -
苌民霡欣: 你是说进程在后台运行吗??要是后台运行就在命令的后面加& 就可以..

蚌山区15167479847: 如何让apache以root身份运行 -
苌民霡欣: 输入命令“sudo cat /XXX/XXX/XXX”/xxx/xxx/xxx在使用中以文件路径替代.cat 语法结构;cat [选项] [文件]...选项-A, --show-all 等价于 -vET-b, --number-nonblank 对非空输出行编号-e 等价于 -vE-E, --show-ends 在每行结束处显示 $-n, --number ...

蚌山区15167479847: 谁能告诉究竟java中的super该怎么用啊? -
苌民霡欣: 我觉得我如下的程序应该个种元素都具备了,楼主看看吧, 1,引用父类中的变量,super.i 2,引用父类的方法,super()是构造方法,super.show()是普通方法,代码如下:public class Test19{ int i; public Test19(){ i=1;} public void show()...

蚌山区15167479847: win10内存占用高解决win10内存不足占用高怎么办 -
苌民霡欣: 解决方法:方法一:1、结束“占用内存高且不再使用”的进程.2、在“任务管理器”界面中,切换到“进程”选项卡,点击“内存”属性项,让所有进程按占用内存大小进行排序,选中占用内存高且不再使用进程,点击“结束任务”按钮...

蚌山区15167479847: 关于Java中super的调用问题 -
苌民霡欣: super(size,name)是调用父类的构造函数,也就是Base的构造函数Base(size,name).你的Base类又没有无参构造函数,当然会报错.如果非要删掉的话,在Base类里添加无参构造函数就行了 package buttontest; class Base { public double size; ...

蚌山区15167479847: Java中的super、函数和方法如题 谢谢了 -
苌民霡欣: 函数和方法就是一回事 你在这里super根本调不到x参数的任何方法,普通方法就是用super. 但是构造方法不一样,构造方法在定义的时候有一个非常死的规定就是方法名字必须和类名字...

蚌山区15167479847: java中super的用法? -
苌民霡欣: class A{ protected float f; private int k; public A(){ } public A(float f) { this.f = f; } /** * Getter for property k * @param the k to get */ public int getK() { return k; } /** * Setter for property k * @param k the k to set */ public void setK(int k) { this.k = k; } } class B...

蚌山区15167479847: linux 怎么把进程启动到后台 -
苌民霡欣: 一、在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:$ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh & 二、对于已经在前台执行的命令,也可以重新...

蚌山区15167479847: top命令中哪个参数是查看正在运行进程数 -
苌民霡欣: Runningtotal 进程总数 running 正在运行的进程数 sleeping 睡眠的进程数 stopped 停止的进程数 zombie 僵尸进程数 Cpu(s): 0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 98.7% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0%hi:硬件CPU中断占用百分比 0.0%si:软中断占用百分比 0.0%st:虚拟机占用百分比

蚌山区15167479847: super Su 怎么用? -
苌民霡欣: 自己刚也在看这玩意怎么用,下面转过来,希望对你有用!教你玩转SuperSU ROOT管理器 SuperSU 这个权限管理器 是在刷机后获得的ROOT权限管理器 我教大家玩转SuperSU 干掉安卓机器人 1首先打开SuperSU界面 会有三个选项1.应用程...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网