精华内容
下载资源
问答
  • 按钮启动/停止

    2016-06-13 22:04:52
    三菱PLC单键启停的方式

    三菱PLC单键启停的方式


    展开全文
  • Python 启动/停止脚本(后台服务)

    万次阅读 2017-06-30 20:23:31
    之前,用 Python/Tornado(Web 服务器框架)实现了一个 LDAP 相关的后台组件,用于客户端的用户...但为了方便部署,想要把它做成一个服务(service),这样就可以用服务来控制它的启动/停止,而且便于在开机时自启动

    简述

    之前,用 Python/Tornado(Web 服务器框架)实现了一个 LDAP 相关的后台组件,用于客户端的用户认证。

    若用命令行方式启动脚本,十分简单:

    # python web_server.py

    但为了方便部署,想要把它做成一个服务(service),这样就可以用服务来控制它的启动/停止,而且便于在开机时自启动。

    | 版权声明:一去、二三里,未经博主允许不得转载。

    启动/停止脚本

    启动/停止脚本 - tornado-ldap(将来需要放置到 /etc/init.d/ 中):

    #!/bin/sh
    # chkconfig: 123456 90 10
    # LDAP server for user authentication
    #
    workdir=/etc/LDAP
    
    daemon_start() {
        cd $workdir
        /usr/local/bin/python /etc/LDAP/web_server.py &
        echo "Server started."
    }
    
    daemon_stop() {
        pid=`ps -ef | grep '[p]ython /etc/LDAP/web_server.py' | awk '{ print $2 }'`
        echo $pid
        kill $pid
        sleep 2
        echo "Server killed."
    }
    
    case "$1" in
      start)
        daemon_start
        ;;
      stop)
        daemon_stop
        ;;
      restart)
        daemon_stop
        daemon_start
        ;;
      *)
        echo "Usage: /etc/init.d/tornado-ldap {start|stop|restart}"
        exit 1
    esac
    exit 0

    第一行:#!/bin/sh 是指此脚本使用 /bin/sh 来解释执行,#! 是特殊的表示符,其后面根的是解释此脚本的 shell 的路径。

    第二行:比较特殊,看起来像是注释,但 chkconfig 命令需要用到,必须存在。定义了在运行级别 1、2、3、4、5、6 中,服务将被激活(状态为:on),90 代表 Start 的顺序,10 代表 Kill(Stop)的顺序。

    实现后台服务

    要将其作为一个后台服务,大概分为以下几步:

    1、为所需的服务创建一个用户
    2、确保该用户对要设置的二进制文件具有完全访问权限:

    /usr/bin/python

    3、将启动/停止脚本 tornado-ldap 复制到 /etc/init.d/

    4、确保脚本被标记为可执行文件:

    chmod +x /etc/init.d/tornado-ldap

    5、在运行级别 2、3、4、5 中启用配置:

    chkconfig tornado-ldap on

    6、启动/停止服务:

    service tornado-ldap start  # 启动服务  也可使用:/etc/init.d/tornado-ldap start 
    service tornado-ldap stop  # 停止服务
    service tornado-ldap restart  # 重启服务

    当一切准备就绪,尝试启停服务:

    [root@localhost ~]# service tornado-ldap stop  # 停止服务
    1879
    Server killed.
    [root@localhost ~]# service tornado-ldap start  # 启动服务
    Server started.
    [root@localhost ~]# service tornado-ldap restart  # 重启服务
    9885
    Server killed.
    Server started.

    Ok,完美运行,而且当再次重启系统时,tornado-ldap 服务也会自动启动。

    展开全文
  • 在同一个项目里面启动服务的方法为本地服务; 布局文件: activity_main.xml package com.example.android20; import android.app.Activity; import android.content.Intent; import android.os.Bundle; ...

    在同一个项目里面启动服务的方法为本地服务;


    布局文件:

    activity_main.xml

    package com.example.android20;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    	Intent intent;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		intent = new Intent(MainActivity.this, MyService.class);
    	}
    
    	public void onclick1(View view) {
    		//显式启动服务
    		startService(intent);
    	}
    
    	public void onclick2(View view) {
    		//关闭服务
    		stopService(intent);
    	}
    }
    



    1.创建MyService继承Service

    MyService.java

    package com.example.android20;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class MyService extends Service {
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		System.out.println("onCreate方法");
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		System.out.println("onStartCommand方法");
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    		System.out.println("onDestrou方法");
    	}
    
    }
    


    2.注册service

    <service android:name=".MyService" >
            </service>

    3.启动服务和停止服务

    package com.example.android20;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    public class MainActivity extends Activity {
    	Intent intent;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		intent = new Intent(MainActivity.this, MyService.class);
    	}
    
    	public void onclick1(View view) {
    		//显式启动服务
    		startService(intent);
    	}
    
    	public void onclick2(View view) {
    		//关闭服务
    		stopService(intent);
    	}
    }
    




    启动的结果:



    当点击启动服务button时 启动服务中的方法是:

    onCreate()和 onStartCommand()

    再次点击启动服务时会再次调用onStartCommand()而不会调用onCreate()

    点击停止服务button时 会调用onDestroy()



    展开全文
  • Linux 开机的启动顺序(详解)

    千次阅读 2011-10-12 15:01:04
    而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作 为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变...
     http://www.51testing.com/?uid-165528-action-viewspace-itemid-99289
    


    http://linuxunix.org/redirect.php?tid=1054&goto=lastpost


    引:本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。
    阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux 的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分的源码主要使用的是C语言,也涉及到了少量的汇编。
    而启动过程中也执行了大量的shell(主要是bash shell)所写脚本。为了方便读者阅读,笔者将整个Linux启动过程分成以下几个部分逐一介绍,大家可以参考下图:


    当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导 Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc 当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这 样就完成了从开机到登录的整个启动过程。


    下面就将逐一介绍其中几个关键的部分:

    第一部分:内核的引导(核内引导)
    Red Hat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权, 然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中 的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。
    其中 bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内 存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来, 检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0x100000。
    那么0x100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?
    0x100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内 核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过"arch/i386/boot/compressed/"中的head.S利用 misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0x100000的。
    当CPU跳到 0x100000时,将执行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳转到 start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函数,start_kernel()中调用了 一系列初始化函数,以完成kernel本身的设置。
    start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完start_kernel(),则基本的Linux核心环境已经建立起来了。
    在start_kernel()的最后,通过调用init()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行 一些外设初始化的工作的,包括调用do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安 装。
    当do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输 入输出文件stdin、stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。到此init()函数结束,内核的引导部分也到此结束了。

    第二部分:运行init
    init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序。init程序需 要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。在Redhat系统中,inittab的内容 如下所示(以“###"开始的中注释为笔者增加的):
    #
    # inittab
    This file describes how the
    INIT process should set up
    # the system in a certain run-level.
    #
    # Author:Miquel van Smoorenburg,

    #Modified for RHS Linux by Marc
    Ewing and Donnie Barnes
    #
    # Default runlevel.
    The runlevels used by RHS are:
    # 0 - halt (Do NOT set initdefault to this)
    # 1 - Single user mode
    # 2 - Multiuser, without NFS
    (The same as 3, if you do not havenetworking)
    # 3 - Full multiuser mode
    # 4 - unused
    # 5 - X11
    # 6 - reboot
    (Do NOT set initdefault to this)
    #
    ###表示当前缺省运行级别为5(initdefault);
    id:5:initdefault:
    ###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)
    # System initialization.
    si::sysinit:/etc/rc.d/rc.sysinit
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    l3:3:wait:/etc/rc.d/rc 3
    l4:4:wait:/etc/rc.d/rc 4
    ###当运行级别为5时,
    以5为参数运行/etc/rc.d/rc脚本,
    init将等待其返回(wait)
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6
    ###在启动过程中允许按
    CTRL-ALT-DELETE重启系统
    # Trap CTRL-ALT-DELETE
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    # When our UPS tells us power has failed,
    assume we have a few minutes
    # of power left. Schedule a shutdown
    for 2 minutes from now.
    # This does, of course, assume you have
    powerd installed and your
    # UPS connected and working correctly.
    pf::powe***il:/sbin/shutdown -f -h +2
    "Powe* **ilure; System Shutting Down"
    # If power was restored before the
    shutdown kicked in, cancel it.
    pr:12345:powerokwait:/sbin/shutdown
    -c "Power Restored; Shutdown Cancelled"
    ###在2、3、4、5级别上以ttyX为参数执行
    /sbin/mingetty程序,
    打开ttyX终端用于用户登录。
    ###如果进程退出则再次运行mingetty程序(respawn)
    # Run gettys in standard runlevels
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2
    3:2345:respawn:/sbin/mingetty tty3
    4:2345:respawn:/sbin/mingetty tty4
    5:2345:respawn:/sbin/mingetty tty5
    6:2345:respawn:/sbin/mingetty tty6
    ###在5级别上运行xdm程序,
    提供xdm图形方式登录界面,
    并在退出时重新执行(respawn)
    # Run xdm in runlevel 5
    x:5:respawn:/etc/X11/prefdm -nodaemon

    以上面的inittab文件为例,来说明一下inittab的格式。其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:
    id:runlevel:action:process
    对上面各项的详细解释如下:
    1. id
    id是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
    2. runlevel
    runlevel 是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模 式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现。
    实际上,进入单用户模式 时,init直接在控制台(/dev/console)上运行/sbin/sulogin。在一般的系统实现中,都使用了2、3、4、5几个级别,在 Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。
    7-9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。
    3. action
    action是描述其后的process的运行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:
    initdefault 是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将读取inittab中的initdefault项,取得其中的 runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入 runlevel。
    sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel。其 余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。
    4. process
    process为具体的执行程序。程序后面可以带参数。
    第三部分:系统初始化

    在init的配置文件中有这么一行:
    si::sysinit:/etc/rc.d/rc.sysinit
    它 调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分 区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
    rc.sysinit约有850多行,但是每个单一的功能还是比较简单,而且带有 注释,建议有兴趣的用户可以自行阅读自己机器上的该文件,以了解系统初始化所详细情况。由于此文件较长,所以不在本文中列出来,也不做具体的介绍。当 rc.sysinit程序执行完毕后,将返回init继续下一步。

    第四部分:启动对应运行级别的守护进程

    在rc.sysinit执行后,将返回init继续其它的动作,通常接下来会执行到/etc/rc.d/rc程序。以运行级别3为例,init将执行配置文件inittab中的以下这行:
    l5:5:wait:/etc/rc.d/rc 5
    这 一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d /rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本, 真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、 restart、status等参数。
    /etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动 脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作 为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都 将重启。
    至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。常见的守护进程有:
    amd:自动安装NFS守护进程
    apmd:高级电源管理守护进程
    arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
    autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
    crond:Linux下的计划任务的守护进程
    named:DNS服务器
    netfs:安装NFS、Samba和NetWare网络文件系统
    network:激活已配置网络接口的脚本程序
    nfs:打开NFS服务
    portmap:RPC portmap管理器,它管理基于RPC服务的连接
    sendmail:邮件服务器sendmail
    smb:Samba文件共享/打印服务
    syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
    xfs:X Window字型服务器,为本地和远程X服务器提供字型集
    Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等服务
    这些守护进程也启动完成了,rc程序也就执行完了,然后又将返回init继续下一步。

    第五部分:建立终端

    rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统。通过按Alt+Fn(n对应1-6)可以在这6个终端中切换。在inittab中的以下6行就是定义了6个终端:
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2
    3:2345:respawn:/sbin/mingetty tty3
    4:2345:respawn:/sbin/mingetty tty4
    5:2345:respawn:/sbin/mingetty tty5
    6:2345:respawn:/sbin/mingetty tty6
    从 上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示 一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用 户的身份。

    第六部分:登录系统,启动完成

    对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况:
    当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。
    Linux 的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是 root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。
    只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
    在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。
    login 程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool /mail/的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用 户的主目录中存在.bash_profile文件,就执行它。
    在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。
    希望通过上面对Linux启动过程的剖析能帮助那些想深入学习Linux用户建立一个相关Linux启动过程的清晰概念,进而可以进一步研究Linux接下来是如何工作的。



    /


    CentOS启动关闭和服务管理



    1.当我们按下电源按钮,把电源投入到机器中后,首先被启动执行的就是这个BOIS(BasicInput/Output System)程序。BOIS的功能是......并且访问硬盘先头512Bit的MBR(Master Boot Record)。
    2.经BOIS的控制,将MBR中的Boot Record调入内存中。这里就要说说Linux的Boot程序了,Linux的Boot程序有GRUB和LILO,而CentOS默认的Boot程序是GRUB。
    3.通过Boot程序,访问硬盘中的Linux内核程序。
    4.将内核程序调入内存中。
    5.内核程序调用完成后,通过内核访问硬盘中将要用到的其他文件。
    内核第一个执行的文件是/sbin/init,而这个文件的设置和定义文件是/etc/inittab这个文件,也就是说/sbin/init按照/etc/inittab的定义来执行下一步的启动,那我们就要看看/etc/inittab文件是怎么回事儿了。
    代码:[root@linux ~]# cat -n /etc/inittab
    1 #
    2 # inittab This file describes how the INIT process should set up
    3 # the system in a certain run-level.
    4 #
    5 # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
    6 # Modified for RHS Linux by Marc Ewing and Donnie Barnes
    7 #
    8
    9 # Default runlevel. The runlevels used by RHS are:
    10 # 0 - halt (Do NOT set initdefault to this)
    11 # 1 - Single user mode
    12 # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    13 # 3 - Full multiuser mode
    14 # 4 - unused
    15 # 5 - X11
    16 # 6 - reboot (Do NOT set initdefault to this)
    17 #
    18 id:3:initdefault: ← 默认的启动模式
    19
    20 # System initialization.
    21 si::sysinit:/etc/rc.d/rc.sysinit ← boot时的处理
    22
    23 l0:0:wait:/etc/rc.d/rc 0 ← 23-29行,各启动模式的处理,分别启动/etc/rc.d/rcX.d脚本
    24 l1:1:wait:/etc/rc.d/rc 1
    25 l2:2:wait:/etc/rc.d/rc 2
    26 l3:3:wait:/etc/rc.d/rc 3
    27 l4:4:wait:/etc/rc.d/rc 4
    28 l5:5:wait:/etc/rc.d/rc 5
    29 l6:6:wait:/etc/rc.d/rc 6
    30
    31 # Trap CTRL-ALT-DELETE
    32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now ← Ctrl+Alt+Del被激活时的处理
    33
    34 # When our UPS tells us power has failed, assume we have a few minutes
    35 # of power left. Schedule a shutdown for 2 minutes from now.
    36 # This does, of course, assume you have powerd installed and your
    37 # UPS connected and working correctly.
    38 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" ← 电源off时的处理
    39
    40 # If power was restored before the shutdown kicked in, cancel it.
    41 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" ← 电源on时的处理
    42
    43
    44 # Run gettys in standard runlevels ← 45-50行是6个虚拟终端
    45 1:2345:respawn:/sbin/mingetty tty1
    46 2:2345:respawn:/sbin/mingetty tty2
    47 3:2345:respawn:/sbin/mingetty tty3
    48 4:2345:respawn:/sbin/mingetty tty4
    49 5:2345:respawn:/sbin/mingetty tty5
    50 6:2345:respawn:/sbin/mingetty tty6
    51
    52 # Run xdm in runlevel 5
    53 x:5:respawn:/etc/X11/prefdm -nodaemon ← 启动模式5的时候,启动/etc/X11窗口系统
    [root@linux ~]#

    在以上的这个文件中,#开头的文件是注释文件,可以忽略不看,但是能够很好的帮我们了解文件。
    这个文件中的定义形势如下:
    通过下表的说明去看这个文件,就清晰明了的多了!

    通过上面的说明,我想你应该可以明白/etc/inittab中的定义是怎么一回事儿了。
    下面我们重点看18,21,26行(其他的自己研究)。
    通过上表我们可以知道:

    18行的定义是默认的启动级别是“3“文本模式。
    21行的定义是启动的过程中执行/etc/rc.d/rc.sysinit文件(启动级别是空,也就是说无论什么级别都执行这个文件),这个文件很长有差不多1000行的内容,主要功能是启动网络,读取文件系统,使swap有效化和调入模块等动作。
    26行的定义和上面的18行的定义是对应的,也就是说18行定义的启动级别是"X",那么就执行文件23到29行定义中的"X"。
    这里18行定义的是启动级别3,就执行26行中启动级别3的定义,执行/etc/rc.d/rc脚本文件(控制文件),并将18行定义的启动级别以参数的形势交给/etc/rc.d/rc文件进行处理。
    这里我们看到“l3:3:wait:/etc/rc.d/rc 3”是把启动级别3交给文件rc处理,那我们有必要看看rc文件都定义了什么。
    /etc/rc.d/rc文件内容如下:
    代码:[root@linux ~]# cat -n /etc/rc.d/rc
    1 #! /bin/bash
    2 #
    3 # rc This file is responsible for starting/stopping
    4 # services when the runlevel changes.
    5 #
    6 # Original Author:
    7 # Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
    8 #
    9
    10 # check a file to be a correct runlevel script
    11 check_runlevel ()
    12 {
    13 # Check if the file exists at all.
    14 [ -x "$1" ] || return 1
    15
    16 # Reject backup files and files generated by rpm.
    17 case "$1" in
    18 *.rpmsave|*.rpmorig|*.rpmnew|*~|*.orig)
    19 return 1
    20 ;;
    21 esac
    22 return 0
    23 }
    24
    25 # Now find out what the current and what the previous runlevel are.
    26 argv1="$1"
    27 set `/sbin/runlevel`
    28 runlevel=$2
    29 previous=$1
    30 export runlevel previous
    31
    32 . /etc/init.d/functions
    33
    34 # See if we want to be in user confirmation mode
    35 if [ "$previous" = "N" ]; then
    36 if [ -f /var/run/confirm ]; then
    37 echo $"Entering interactive startup"
    38 else
    39 echo $"Entering non-interactive startup"
    40 fi
    41 fi
    42
    43 # Get first argument. Set new runlevel to this argument.
    44 [ -n "$argv1" ] && runlevel="$argv1"
    45
    46 # Is there an rc directory for this new runlevel?
    47 [ -d /etc/rc$runlevel.d ] || exit 0
    48
    49 # First, run the KILL scripts.
    50 for i in /etc/rc$runlevel.d/K* ; do
    51 check_runlevel "$i" || continue
    52
    53 # Check if the subsystem is already up.
    54 subsys=${i#/etc/rc$runlevel.d/K??}
    55 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
    56 || continue
    57
    58 # Bring the subsystem down.
    59 if egrep -q "(killproc |action )" $i ; then
    60 $i stop
    61 else
    62 action $"Stopping $subsys: " $i stop
    63 fi
    64 done
    65
    66 # Now run the START scripts.
    67 for i in /etc/rc$runlevel.d/S* ; do
    68 check_runlevel "$i" || continue
    69
    70 # Check if the subsystem is already up.
    71 subsys=${i#/etc/rc$runlevel.d/S??}
    72 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
    73 && continue
    74
    75 # If we're in confirmation mode, get user confirmation
    76 if [ -f /var/run/confirm ]; then
    77 confirm $subsys
    78 test $? = 1 && continue
    79 fi
    80
    81 update_boot_stage "$subsys"
    82 # Bring the subsystem up.
    83 if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
    84 export LC_ALL=C
    85 exec $i start
    86 fi
    87 if egrep -q "(daemon |action |success |failure )" $i 2>/dev/null \
    88 || [ "$subsys" = "single" -o "$subsys" = "local" ]; then
    89 $i start
    90 else
    91 action $"Starting $subsys: " $i start
    92 fi
    93 done
    94 rm -f /var/run/confirm
    95 if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
    96 /usr/bin/rhgb-client --quit
    97 fi
    [root@linux ~]#
    在这个文件中我们看看如下的几行:



    50行以K开头的脚本文件
    60行执行stop
    67行以S开头的脚本文件
    91行执行start
    在这个文件中,每个程序块的部分都有注释(#开头的行),如果有兴趣的话可以自行研究一下。
    似乎不是那么太难,就是check→do,确认后执行,判断后执行的样子。


    rc.d目录下面的文件:
    代码:[root@linux ~]# ls -l /etc/rc.d
    总用量 112
    drwxr-xr-x 2 root root 4096 12月 28 12:45 init.d
    -rwxr-xr-x 1 root root 2352 2004-03-17 rc
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc0.d
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc1.d
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc2.d
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc3.d
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc4.d
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc5.d
    drwxr-xr-x 2 root root 4096 12月 28 12:45 rc6.d
    -rwxr-xr-x 1 root root 220 2003-06-24 rc.local
    -rwxr-xr-x 1 root root 27584 8月 13 17:10 rc.sysinit
    [root@linux ~]#
    我们看到了,在这个目录下面,有刚才提到的rc文件,还有另外的一些文件,我们来简单说明一下。
    1. init.d
    这个不是文件,是一个目录,这个目录下面存放着各各服务的控制脚本,这下面的文件和你安装了些什么软件包有关系。如果 你有兴趣你可以察看他们的脚本文件,接下来的说明中我们还会说到他,因为/etc/rc.d/rcX.d下的文件和这个init.d下面的文件是通过软连接相连的。

    2. rc
    这个文件我们上面提到过,跳过了。

    3. rc.loca
    这个文件也许会用到,如果你安装了一些软件或服务,并非系统标准的服务,比如手动的安装了Httpd,这样你用chkconfig命令是无法操作httpd的,开启服务器的时候也并不默认的启动这个httpd服务,这个时候你就可以将启动命令写到这个文件中,让开机启动服务完毕之后,最后启动这个httpd服务,注意是最后。这里说的httpd只是一个例子,将来也许会有很多的自己安装的服务会用到这个文件,知道一下,要用到的时候自然就明白。当然还有另外一种方法,就是自己写一个启动脚本文件,让系统开机时读取脚本文件来对httpd进行启动操作

    4. rc.sysini
    我们上面提到过这个文件,这个文件是在boot的时候就被执行的脚本,它的任务是初始化系统的网络,设定hostname,欢迎信息表示,时钟设置,挂载文件系统等。有兴趣可以读它的脚本文件。

    5. rcX.d
    这个rcX.d里面的X代表了0~6的数字(6种启动模式)。我们看到了它们都是目录,下面放着的都是我们上面说的/etc/rc.d/init.d下面文件的link。这里我们已rc3.d为例子,简单说明一下。
    在察看这个文件的时候注意2点:
    ####第一:ls -l 察看它们的详细信息,看看他们的link指向
    ####第二:ls -l 察看它们的文件名的头字母,形式应该是这样的[S或K <数字> <名称>]的形势。S代表启动,K代表停止。
    不要迷糊,/etc/rc.d/rc就定义了这个文件名称头文字的“S”和“K”。也就是开机的时候,已S开头的脚本文件别执行,这个服务就被开机运行;
    那么已K开头的文件不被执行,这个文件所控制的服务也不被执行,这个文件控制的服务也不被开机运行。
    这样看来,我们在给服务器左右化的时候,就可以直接的将相应的启动模式(rc0.d~rc6.d)下的相应服务控制脚本的文件名改掉(S改成K,K改成S),
    就能够简单的优化开机时系统将运行哪儿些个服务。
    如果通过命令来控制的话,那命令是chkconfig命令.......编辑中......
    如果你察看过rc0.d~rc6.d的目录下的文件名称,你会发现,他们以S开都得文件名数量是不同的。

    /etc/rc.d/rc3.d下都有什么(一部分而已,你可以在自己的系统下面察看全部)
    代码:[root@linux ~]# ls -l /etc/rc.d/rc3.d
    合計 224
    lrwxrwxrwx 1 root root 21 1月 5 05:24 K01tog-pegasus -> ../init.d/tog-pegasus
    lrwxrwxrwx 1 root root 13 1月 5 05:12 K01yum -> ../init.d/yum
    lrwxrwxrwx 1 root root 24 1月 5 05:12 K02NetworkManager -> ../init.d/NetworkManager
    lrwxrwxrwx 1 root root 15 1月 5 05:12 K03rhnsd -> ../init.d/rhnsd
    lrwxrwxrwx 1 root root 19 1月 5 05:08 K05saslauthd -> ../init.d/saslauthd
    lrwxrwxrwx 1 root root 16 1月 5 05:11 K10psacct -> ../init.d/psacct
    lrwxrwxrwx 1 root root 17 1月 5 05:25 K12FreeWnn -> ../init.d/FreeWnn
    lrwxrwxrwx 1 root root 13 1月 5 05:12 K20nfs -> ../init.d/nfs
    lrwxrwxrwx 1 root root 14 1月 5 05:11 K24irda -> ../init.d/irda
    lrwxrwxrwx 1 root root 16 1月 5 05:10 K50ibmasm -> ../init.d/ibmasm
    lrwxrwxrwx 1 root root 17 1月 5 05:12 K50netdump -> ../init.d/netdump
    lrwxrwxrwx 1 root root 16 1月 5 05:26 K73ypbind -> ../init.d/ypbind
    [root@linux ~]#
    接下来我们看看控制服务的一些工具
    chkconfig
    setup
    system-config-services
    我们分别来看看这3个工具(如果还有别的,告诉我)
    chkconfig
    这个工具我们很熟悉,并且在我们的网站配置祥解中也提到过他的使用。
    执行权限:root
    命令路径:/sbin/chkconfig
    使用法:
    chkconfig <服务名> on #这个和接下来的off这个其实就是把以K开头的脚本文件从命名
    chkconfig <服务名> off #如果你有兴趣自己试验一下就知道了
    chkconfig --list [服务名]
    chkconfig --add <服务名>
    chkconfig --del <服务名>
    chkconfig [--level <启动级别>] <服务名> <on|off|reset|resetpriorities>

    setup
    是系统综合的配置工具,命令行下也可以用。这个不多说,操作一下就知道怎么回事了。

    system-config-services
    如果你安装了gnome这样的窗口桌面系统,你也可以使用这个工具来体验下鼠标点击带来的方便。
    (如果你安装了桌面系统,可以# system-config加Tab键,会有很多工具的执行命令,体会下。)

    展开全文
  • 所以绘制顺序不要写反了。如果先绘制实心圆在绘制文字在绘制空心圆。这时你会发现文字是看不到了,被覆盖了。 * @param canvas */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /...
  • 1.重写这个对象的触摸事件(对触摸事件事件分发机制的同学不了解的可以查阅其他资料) 2.在MotionEvent.ACTION_DOWN:事件中启动一个线程,这个线程类似生产者,它不停的生产想要的事件 这里的事件为了调用的顺序...
  • 目前实现要求用户每隔一段时间轮询一下所有按钮的状态,并分别调用一次每个按钮对象的TimeTick方法将其当前状态传入,然后TimeTick方法就会把这个按钮发生了什么事件(按下、抬起、长按、单/连击)返回给你,然后就...
  • 四种启动模式 标志位 ThanksAndroid 中的 Task 是什么我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activity 或者按返回时,会导致 Activity 的入栈/出栈。有时候我们...
  • Android AnimationDrawable动画APP启动、加载引导页面(画面) AnimationDrawable是Android的Frame动画,可以简单的认为此AnimationDrawable能够将一系列资源图片加载成“电影”一样播放。当下,在一些APP中,...
  • CDH启停顺序

    千次阅读 2016-09-11 11:26:09
    之前,一直在考虑CM、CDH组件按什么样的顺序启动停止比较好。最近又安装了一下CDH集群,他们的安装顺序是如下图所示的: CDH的启动停止也按照这样的顺序应该是比较合理的。
  • OEM按钮乱码问题解决

    千次阅读 2014-06-08 22:33:51
     在Linux环境中安装Oracle 10g,启用EM时,出现按钮显示乱码现象,如下: 二、分析问题: 因为在安装Oracle10g时,JDK/JRE自动选择了字符集,而在$ORACLE_HOME/jdk/jre/lib和$ORACLE_HOME/jre/1.4.2/lib目录下...
  • fm_out使用的是输出符号,在sb1_start处并上fm_out表示当fm_out输出高电平时(即sb1_start不需要闭合,该线路也通),实现了输出自锁定,完成按一次启动按钮,电机一直运行。当按下sb2_stop后,线路断开,fm_out输出...
  • 1、原理很简单,对于超时控制:做个定时器,到时间自动停止。 2、对于文件大小控制:还是使用定时器,每个一定时间检测文件大小,超过设置大小自动停止。 本demo时长、文件大小设置使用的是SharedPreferences   ...
  • 文章目录 一、顺序控制的基本概念 二、S7-300PLC顺序控制指令程序编写 S7-300顺序控制简介 1、S7-GRAPH基本指令 3、GRAPH程序的编辑 三、清洗车间的洗涤控制系统 1、题目 2、步骤 3、编写的程序 四、红黄绿灯的...
  • 我所理解的Android 启动模式

    千次阅读 2016-06-21 23:02:07
    是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。...
  • Activity启动模式 及 Intent Flags 栈 的关联分析

    万次阅读 多人点赞 2014-05-10 18:44:14
    在学习 Android 的过程中,Intent是我们最常用Android用于进程内或进程间通信的机制,其底层的通信是... 上面总结了下Activity启动模式 及 Intent Flags 栈 的关联分析,便于之后一篇文章中跳转模式的了解使用。
  • 在三种情况下,应用程序应该能够处理媒体按钮事件,按以下顺序排列: 当应用程序的UI活动是可见的 当UI活动被隐藏并且应用程序的媒体会话处于活动状态时 当UI活动被隐藏并且应用程序的媒体会话处于非活动状态...
  • PLC顺序控制学习,交通灯PLC模拟

    千次阅读 2018-12-20 19:42:29
    停止时,要求按M3~M1的顺序停止。 花样喷水控制     2.人行横道交通灯顺序控制的编程 按下起动按钮I0.0,车道和人行道的交通灯将按图5-31的波形图所示的顺序变化。刚进入RUN模式时,将初始步S0.0...
  • Unity3D中组件事件函数的执行顺序

    千次阅读 2015-06-23 10:28:52
    事件函数的执行顺序 Unity 脚本中有许多按预设顺序以脚本身份运行的事件函数。其执行顺序如下: 加载第一个场景 启动场景时调用这些函数(为场景中的每个对象调用一次)。 Awake: 始终在调用任何 Start 函数之前和...
  • ubuntu启动过程

    万次阅读 多人点赞 2017-06-02 04:31:45
    本文讲述了从按下开机按钮到ubuntu(14.04 LTS)启动完毕的过程。grub 入门知识和设置进程开机启动方法。
  • 脑子里记了太多,最近感觉不太够用了,...Service内容基本会在这章总结到,总结顺序如下: Service概述 Service生命周期概述 Service分类: *按启动方式分类:通过Context.startService()或Context.bindServic...
  • 计算机启动过程

    千次阅读 2018-02-25 19:18:58
    下图描述了整个计算机启动的过程:计算机启动过程当你按下计算机的电源按钮时,启动过程就开始了。一旦主板电源接通,主板就会初始化主板上的固件——一些芯片组和周边——并且会尝试让CPU运行起来。如果在这...
  • Jmeter配置之线程组启动和配置说明

    万次阅读 2018-05-28 23:06:23
    线程组启动停止说明 启动停止线程组的方法: 1、右键线程组启动停止,如下图所示: 2、在菜单栏点击快捷按钮,如下图所示: 3、菜单栏的运行选项下,如下图所示: 三种启动位置选项有些差异,主要...
  • Android 7.0 ActivityManagerService(2) 启动Activity的过程:一

    万次阅读 多人点赞 2016-12-01 21:23:54
    从这一篇博客开始,我们将阅读AMS启动一个Activity的代码流程。 自己对Activity的启动过程也不是很了解,这里就初步做一个代码阅读笔记,为以后的迭代打下一个基础。
  • Chrome启动参数最全集合

    万次阅读 2019-03-07 17:54:22
    翻译来自谷歌自动翻译,如果说明不清楚,自行查询。 序号 条件 说明 ...已经观察到,当文件读取具有相同/prefetch:#参数的3个进程启动一致时,Windows预取器开始在进程启动时批量发出读取...
  • netstopX-----停止X服务 netstat-an----命令检查接口 netsetup.cpl---无线网络安装向导 notepad--------打开记事本 nslookup-------IP地址侦探器 narrator-------屏幕“讲述人” ntbackup-------系统备份和...
  • activity的启动模式和栈管理

    千次阅读 2014-07-03 15:00:28
    Activity启动模式 及 Intent Flags 栈 的关联分析。 文章结构: 1.什么是栈 2 . Activity栈 3 . Task 4 . Activity启动模式 5 . Activity栈和Task联系 6 . Intent Flags  7 . Activity相关属性 taskAffinity 1....
  • 英文网址:...按下开机按钮后,首先BIOS/UEFI做最基本的硬件自检初始化, 然后加载预设/手动选择的磁盘/网络上的引导加载器(例如GRUB2),引导加载器进一步从磁盘/网络上加载操作系统内核(例如Linux)。 ...
  • CentOS LInux启动关闭和服务管理

    千次阅读 2014-06-17 16:22:27
    CentOS启动顺序: 1.当我们按下电源按钮,把电源投入到机器中后,首先被启动执行的就是这个BIOS(BasicInput/Output System)程序。BIOS的功能是......并且访问硬盘先头512Bit的MBR(Master Boot Record)。 2...
  • Unity3D中自带事件函数的执行顺序

    千次阅读 2016-06-03 17:29:42
    在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行。其执行顺序如下: 编辑器(Editor) Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对象上,并且在Reset命令被使用时也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,447
精华内容 11,378
关键字:

停止按钮与启动按钮顺序