zoukankan      html  css  js  c++  java
  • Linux、UNIX设置开机自动运行命令、脚本配置

    一般我们不建议人工部署开机自动启动的脚本。而是建议通过crontab 部署脚本监控,理由如下:

    1.自动开机部署脚本不好定位问题,有可能导致主机重启过慢。

    2.自动开机部署脚本不好定位问题,有可能导致主机无法打开对应的服务。无法telnet 主机

     详细描述如下:issue 2

    http://www.cnblogs.com/feiyun8616/p/7880506.html

    3.因此本文以下方法仅供学习,不要在生产环境下设置。

    sampe 1:1583118.1

    1.  As "root" use create a wrapper/init script which calls the OSWatcher startup script (startOSWbb.sh).  Here is an example of such script named OSW_init.sh.  Please note that this example wrapper script is calling the OSWatcher startup script with default options.  Pass the required parameters as desired and refer to OSWatcher User Guide using MoS Document 1531223.1.  This script needs to be created under /etc/init.d:

    # uname -a
    SunOS orasol10 5.10 Generic_147148-26


    # pwd
    /etc/init.d
    # cat OSW_init.sh
     OSW_SRC_DIR=/u01/app/OSW <<<<----- Modify this to reflect your OSW source directory
    echo $OSW_SRC_DIR
    echo "******************************************************" >> $OSW_SRC_DIR/init_osw.log


    case $1 in
    'start')
    echo "...Starting OSWBB from init at `date` " >> $OSWBB_SRC_DIR/init_osw.log
    cd $OSW_SRC_DIR;
    ./startOSWbb.sh
    ;;
    'stop')
    echo "...Stopping OSWBB from init at `date` " >> $OSWBB_SRC_DIR/init_osw.log
    cd $OSW_SRC_DIR;
    ./stopOSWbb.sh
    ;;
    *)
    echo "Usage: $0 start|stop" >&2
    exit 1
    ;;
    esac
    exit 0

      

    2.  Add "execute" permissions on this script:

    #chmod +x OSW_init.sh


    3.  Create a soft link to this script from /etc/rc3.d:

    ln -s /etc/init.d/OSW_init.sh /etc/rc3.d/S90StartOSW_init


    The wrapper script (OSW_init.sh) would be called with "start" option/parameter on each startup.

    4.  Similarly, create another soft link to the same script from /etc/rc0.d:

    ln -s /etc/init.d/OSW_init.sh /etc/rc0.d/K30StopOSWBB_init
    ln -s /etc/init.d/OSW_init.sh /etc/rc3.d/K30StopOSWBB_init

     The wrapper script (OSW_init.sh) would be called with "stop" option/parameter on each shutdown.

    5. A log file will be created/appended to in your OSWbb Source directory with information similar to the following on each reboot:

    $ tail -f init_osw.log
    ...Stopping OSW from init at Tue Sep 10 20:57:26 CDT 2013
    ******************************************************
    ...Starting OSW from init at Tue Sep 10 21:00:04 CDT 2013
    ******************************************************
    ...Stopping OSW from init at Tue Sep 10 21:16:17 CDT 2013
    ******************************************************
    ...Starting OSW from init at Tue Sep 10 21:17:26 CDT 2013
    Note:
    Trace File Analyzer(TFA) Collector, a diagnostic collection utility, contains many tools including OSWatcher and will also automate startup of the OSWatcher
    For information see:
    Document 1513912.1 TFA Collector - Tool for Enhanced Diagnostic Gathering
     
     
     
     
    sampe 2: for linux  (文档 ID 1674210.1)

    SYMPTOMS

    When installing the RPM oswbb-service-1.1.7-1.noarch.rpm for autostartup it fails with the following error:

     (missing " on line 45) in file /usr/libexec/oswbb-service/oswbb-helper.

    CAUSE

     There is problem in RPM code of oswbb-service-1.1.7-1.noarch.rpm

    SOLUTION

    Workaround

    change the below line in the oswbb-helper file
    "${OSW_ARCHIVE}/heartbeat 2>&1 &
      

    to 
    "${OSW_ARCHIVE}"/heartbeat 2>&1 &
      

    Or

    Download the latest RPM from the document below:

     

    说明:

    第一章 AIX开机启动过程介绍
    ----------------------------
    不从最开始说起了,只说从AIX kernel被装载到内存开始。
    1、AIX系统存储在BLV的kernel在内存中创建/(root),/usr/和/var文件系统。
    要注意,这里所说的文件系统,包括kernel在启动过程中都是存储在RAM(内存)中的。
    他们没有权限访问BLV之外的任何内容。
    2、文件系统被装载到RAM之后,kernel开始执行init进程,这个时候init进程开始接管系统启动进程。
    3、AIX kernel把init进程的PID设为1,这个进程是作为parent,root进程存在的,是AIX系统中运行的其他所有进程的父进程.当init进程被装载并在启动过程运行,init调用rc.boot.
    4、rc.boot文件在AIX系统启动过程中有三个重要的作用。
    (1)、第一部分是rc.boot初始化了系统的硬件,使其为系统的启动做好准备。通过系统设置命令cfgmgr,一小部分系统启动需要的驱动被配置。
    (2)、第二部分是文件系统/,/usr,/var和页面空间被装载。在这些文件系统被装载以后,init被硬盘上的PID为1的init进程所替代,同时RAM被清空。
    (3)、第三部分和最后部分,rc.boot,实际的init进程是从硬盘上运行的。
    当init被执行后,/etc/inittab文件被堵去,同时里面的每一条都被执行。
    在这个过程中,/tmp文件系统正被装载到硬盘上。
    现在,系统正在启动的最后过程中,cfgmgr命令再一次运行把剩下的在第一部分没有被rc.boot运行的驱动运行起来。
    5、init进程被执行以后,下一步就是init会打开/etc/inittab,并且执行里面的内容。

    ----------------------------------------------
    第二章 AIX启动的相关命令知识
    ----------------------------------------------
    1、确认当前系统的运行级别
          在系统维护或者切换系统运行级别之前,你也许需要检查当前系统的运行级别。
           cat /etc/.init.state
            lsitab init

    2、显示系统运行级别的更改纪录
         提示:确保bosext2.acct.obj 代码安装在你的系统上。
          (1) 以root身份登陆系统.
          (2)执行/usr/lib/acct/fwtmp </var/adm/wtmp |grep run-level
             得到类似的结果:
            run-level 2 0 1 0062 0123 697081013 Sun Feb 2 19:36:53 CST 1992
             run-level 2 0 1 0062 0123 697092441 Sun Feb 2 22:47:21 CST 1992
             run-level 4 0 1 0062 0123 698180044 Sat Feb 15 12:54:04 CST 1992

    3、改变系统运行级别基础知识
    当系统第一次启动之后,系统按照/etc/inittab文件的内容,进入默认的系统运行级别,直到系统管理员发出改变系统级别的命令。
    下面是系统定义的系统运行级别:
    0-9 当init命令改变系统运行级别为0-9时,将会杀掉当前系统级别下正在运行的所有进程,并进入新的系统运行级别。
    0-1 为未来的操作系统保留
    2 默认运行级别
    3-9 可以根据用户的需求进行自定义
    a,b,c 当init命令接收到运行a,b或者c的时候,init命令不杀死任何当前运行的进程,只是启动新运行级别内定义的新进程。
    Q,q init命令将会重新检查/etc/inittab文件
    S、s 维护模式
    M、m 维护模式

    4、改变系统运行级别
    (1)、检查/etc/inittab文件,确认你想改变的系统运行级别。
    (2)、使用wall命令通知所有用户你将改变
    (3)、使用smit telinit快速改变系统运行级别
    (4)、使用init n或者telinit n命令改变系统运行级别,其中n为系统运行级别。

    5、改变/etc/inittab文件
    在有些情况下,你需要增加、改变、列出、删除/etc/inittab文件中的记录。/etc/inittab文件定义了哪些进程在哪个系统运行级别里运行。
    当你运行init命令的时候,它将读取/etc/inittab文件。每一条记录定义了一个进程在一个进程的运行。
    (1)、/etc/inittab文件参数
    1.1 Identifier 定义了唯一的标识(1到14个字符)。
    1.2 Run Level 定义了进程所在的运行级别(1到20个字符)。 1.3 Action 定义了init命令将为此条进程执行的操作,包括:respawn,wait,once,boot,bootwait,powerfail,powerwait,off,hold,ondemand,initdefault和sysinit.
    respawn 如果进程不存在,Start这个进程,不等待它的结束,继续扫描inittab文件。如果这个进程结束了,restart它。
    wait Start这个进程,并且等待它的结束。
    once Start这个进程,并且不等待它的结束。如果这个进程结束,不restart它。
    boot 仅在系统重启时执行。
    bootwait 当服务第一次从单用户变为多用户时执行
    powerfail 仅当如果init收到一条power错误时执行命令
    powerwait 仅当如果init收到一条power错误时执行命令,同时一直等待进程的结束,然后才继续扫描inittab文件。
    off 如果进程正在运行,发出SIGTERM信号,然后在20秒内执行SIGKILL
    ondemand 这个参数等同于respawn,但是只在a,b,c级别运行。
    initdefault 只有当init初始化执行,才扫描内容。
    sysinit 在登陆前,在init得到权限控制之前执行内容。
    1.4 Command 包含需要执行的shell命令。
    (2)、下面的命令可以支持对/etc/inittab文件进行操作。
    chitab 改变/etc/inittab文件的记录。
    lsitab 列出/etc/inittab文件的记录。
    mkitab 往/etc/inittab文件里增加记录。
    rmitab 从/etc/inittab文件里删除记录。
    (3)、命令举例
    增加纪录,往/etc/inittab文件里增加一条记录,执行
    mkitab Identifier:Run Level:Action:Command
    例如:tty002:2:respawn:/usr/sbin/getty /dev/tty2
    改变记录,改变/etc/inittab文件里的一条记录,执行
    chitab Identifier:Run Level:Action:Command
    例如:将上例的运行级别从2改为2和3,chitab tty002:23:respawn:/usr/sbin/getty /dev/tty2
    列出记录,列出/etc/inittab文件中的所有记录
    lsitab -a
    列出某个指定的记录
    lsitab Identifier
    例如:lsitab tty2
    删除记录
    rmitab Identifier
    例如:rmitab tty2

    6、执行运行级别脚本
    运行级别脚本允许用户在更改运行级别时启动和停止所选择的应用程序。以 K 开头的脚本是停止脚本,以 S 开头的脚本是启动脚本。
    这些脚本保存于它们所从属的运行级别的特定子目录中,每个子目录的格式为 rcn.d,其中 n 表示运行级别:
    /etc/rc.d/rc2.d
    /etc/rc.d/rc3.d
    /etc/rc.d/rc4.d
    /etc/rc.d/rc5.d
    /etc/rc.d/rc6.d
    /etc/rc.d/rc7.d
    /etc/rc.d/rc8.d
    /etc/rc.d/rc9.d
    ---------------------------------------
    第三章 开机自动运行程序
    ---------------------------------------
         开机启动程序的方法有很多,我只谈谈思路,然后给出一些解决方法。
         从第一章AIX系统启动过程,我们知道AIX系统在启动过程中,会扫描inittab文件的内容,并执行它。
           1、那么,我们可以通过直接修改inittab文件,使系统在开机重启时运行我们的命令。
           2、也可以通过inittab文件里指向的脚本(rc.local、rc.d组,后面会详细介绍)。
                        间接使系统在开机重启时运行我们的命令。
           3、其他方法:如使用crontab的定时任务功能,间接启动脚本,
                       这种方法不是开机后马上运行,要看crontab里设置的时间间隔的长短而定。
           
    一、通过rc.local启动(最简单的方法)
       rc.local是inittab里的一个脚本指向,通过运行lsitab -a|grep rc.local ,我们可以得到rc.local:2:once:/etc/rc.local > /dev/console 2>&1 
        1、 mkitab -i rcnfs "rc.local:2:once:/etc/rc.local > /dev/console 2>&1"   #如果inittab文件里没有关于rc.local的信息,可以通过此命令创建脚本。
                注意系统运行级别要与你想要运行的系统运行级别一致,这里系统运行级别是2。
        2、touch /etc/rc.local #新建rc.local文件
        3、chmod 700 /etc/rc.local #设置执行权限
        4、把执行脚本放到/etc/rc.local里之后,AIX系统在重新启动时,就会运行/etc/rc.local里的脚本了。

    二、通过/etc/rc.d脚本启动(需要编写startstop脚本)
        /etc/rc.d是inittab里的一组脚本指向,通过运行lsitab -a|grep rc.d,我们得到
          l2:2:wait:/etc/rc.d/rc 2 
          l3:3:wait:/etc/rc.d/rc 3 
          l4:4:wait:/etc/rc.d/rc 4 
          l5:5:wait:/etc/rc.d/rc 5 
          l6:6:wait:/etc/rc.d/rc 6 
          l7:7:wait:/etc/rc.d/rc 7 
          l8:8:wait:/etc/rc.d/rc 8 
          l9:9:wait:/etc/rc.d/rc 9 
       1、cd /etc/rc.d/       #进入/etc/rc.d目录
       2、cd /samples       #进入/etc/rc.d/samples 目录,可以得到K70lpd、README.txt、S70lpd三个文件。
               这里只是简单的模仿K70lpd和S70lpd,更高级的方法,留给大家自己研究了。
               下面,我们分别创建自己的启动和结束脚本。
                     例如:
    # more K69oa
    #!/bin/ksh
    ##################################################
    # name: K69oa
    # purpose: sample script that start or stop oa.
    ##################################################

    case "$1" in
    start )
            WebSphere/AppServer/bin/startServer.sh server1
            IBMHttpServer/bin/apachectl start
            ;;
    stop )
            WebSphere/AppServer/bin/stopServer.sh server1
            IBMHttpServer/bin/apachectl stop
            ;;
    * )
            echo "Usage: $0 (start | stop)"
            exit 1
    esac

    # more S69oa
    #!/bin/ksh
    ##################################################
    # name: S69oa
    # purpose: sample script that start or stop oa.
    ##################################################

    case "$1" in
    start )
            WebSphere/AppServer/bin/startServer.sh server1
            IBMHttpServer/bin/apachectl start
            ;;
    stop )
            WebSphere/AppServer/bin/stopServer.sh server1
            IBMHttpServer/bin/apachectl stop
            ;;
    * )
            echo "Usage: $0 (start | stop)"
            exit 1
    esac
          
        3、chmod 700 这两个脚本
        4、把这两个脚本放到/etc/rc.d/rc2 下。
        5、使用shutdown -rF重新启动机器时,会自动运行放在/etc/rc.d/rc2下的S69oa脚本中的stop部分;

                系统重启之后,系统会自动运行放在/etc/rc.d/rc2下的S69oa脚本中的start部分。

    FROM:http://k0521klb.iteye.com/blog/1306474

     
     

    本文如无特殊解释,init.d指的就是/etc/rc.d/init.d目录。

    本文包括3部分内容
    1、        Linux的引导过程
    2、        运行级别
    3、        /etc/rc.d/ 与/etc/rc.d/init.d的关系
    都仅限于自身的理解,如有差错和不足的地方请指正和补充!一起学习,一起进步。

            “/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行”。开始之前,先引用李善明经理昨天晚上总结时的一个理解,让大家先对init.d目录有个大概的印象。在进入init.d之前,我们一起来做两个准备工作,linux的引导过程和运行级别的概念。

    一、        Linux的引导过程
    系统启动之后,在进入init.d之前,我们先来看看系统都做了什么工作,先看看一个图(此图来自网络)

        从这个图中,我们从比较高的角度去看开始引导的整个过程,比较清晰明了。系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。
        内核被加载到内存中之后,就开始执行了。一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。

    二、        运行级别(run level)
        Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下: 
      # 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
      # 1 - 单用户模式
      # 2 - 多用户,没有 NFS
      # 3 - 完全多用户模式(标准的运行级)
      # 4 – 系统保留的
      # 5 - X11 (x window)
      # 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

    这是两个表较常用运行级别,左图redhat9 级别3启动的将是文本界面,右图fc7级别5启动的将是图形界面。

    三、        /etc/rc.d/与/etc/rc.d/init.d的关系
        写到这里,应该差不多要进入init.d了,可是我觉得单写/etc/rc.d/init.d的话不一定能说得清楚明白,就拿它跟/etc/rc.d这个它上一级的目录一起来讨论,可能比较合适一些,因为他们之间有着千丝万缕的关系。
        在这里先解释一下init.d里面放的都是什么东西。这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。
    前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),相信从命名的角度大家也能猜到该运行/etc/rc.d/init.d里面的脚本了,不然它为什么也叫init(.d)呢是吧。没错,是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
        那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。
        在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活的init.d里的脚本。

    redhat9    ls


    fc7          ls -l


        这样看的就很清楚了。

        到这里,估计大家可能都比较清楚了,我开始也以为是这样的。可是后来我仔细看过和比较这些链接文件和init.d里真正被执行的脚本的文件名之后,一直有几个问题没弄明白。借着写这个文章的机会,我做了一些功课,总算是大概解开了那些疑惑。
    1、这些链接文件前面为什么会带一个Kxx或者Sxx呢?
        是这样的,带K的表示停止(Kill)一个服务,S表示开启(Start)的意思
    2、K和S后面带的数字呢?干什么用的
        这个我开始的时候还以为是排列起来好看或者数数用呢(是不是很幼稚?)。后来发现不是的。它的作用是用来排序,就是决定这些脚本执行的顺序,数值小的先执行,数值大的后执行。很多时候这些执行顺序是很重要的,比如要启动Apache服务,就必须先配置网络接口,不然一个没有IP的机子来启动http服务那岂不是很搞笑。。。
    3、无意中我发现同一个服务带S的和带K的链接到init.d之后是同一个脚本。我就纳闷了,为什么会是执行同一个脚本呢?
        这个时候真是S和K的妙用了,原来S和K并不止是用来看起来分的清楚而已。S给和K还分别给init.d下面的脚本传递了start和stop的参数。哦,是这样的(焕然大悟的样子,呵呵)!这时我才想起来原来曾经无数用过的/etc/rc.d/init.d/network restart命令。原来传S时相当于执行了/etc/rc.d/init.d/xxx start这条命令,当然K就相当于/etc/rc.d/init.d/xxx stop了。

     

    转 http://blog.itpub.net/23135684/viewspace-668924/

    方法一:
    编辑/etc/rc.d/rc.local
    加入要执行的命令。
    如:
    [root@rhel5 rc.d]# cat rc.local
    #!/bin/sh
    #
    # This script. will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style. init stuff.

    touch /var/lock/subsys/local
    vncserver :1

    注意:
    此种方法只适合在linux上试用,其他HP,AIX并不使用。以下的2种方法相对来说是通用的,其他UNIX系统同样适用。

    Linux开机自动启动ORACLE设置

    1.安装好Oracle数据库后: 执行 dbstart和dbshut会提示:

    [oracle@oracle11g ~]$ dbstart
    ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
    Usage: /u01/app/oracle/oracle/product/10.2.0/db_1/bin/dbstart ORACLE_HOME

    错误原因是:dbstart和dbshut脚本文件中ORACLE_HOME_LISTNER的设置有问题,分别打开两个文件找到:ORACLE_HOME_LISTNER=$1,修改为

    2.如何在Linux启动时自动启动Oracle监听和实例

    首先要解决上面的问题,才能继续哟! 

    第一步:修改/etc/oratab文件,命令如下:

    [oracle@oracle11g ~]$ vi /etc/oratab

    找到:accp:/u01/oracle:N   修改为: accp:/u01/oracle:Y

    第二步:把lsnrctl start和dbstart添加到rc.local文件中,命令如下:

    [oracle@oracle11g ~]$ vi /etc/rc.d/rc.local

    添加:

    su oracle -lc "/u01/oracle/bin/lsnrctl start"

    su oracle -lc  /u01/oracle/bin/dbstart

    注意:第一个命令有空格,所以要用引号的 

    重启试试吧!

    文章可以转载,必须以链接形式标明出处。
    (https://www.cnblogs.com/andy6/p/5723436.html)

    在使用第二种、第三种方法之前需要了解一下inittab配置文件。
    http://space.itpub.net/370491/viewspace-216955


    方法二:
    1.在/etc/init.d/下创建一个文件test,加入执行内容。
    2.修改执行权限:
    chown 777 test
    3.创建链接:
    ln -s /etc/init.d/test /etc/rc.d/rc3.d/S900test

    注意:
    1.注意对test文件加入执行权限。
    2.在创建链接的时候一定使用绝对路径。
    3.此种方法的重点并不在于test存放在/etc/init.d目录下(一般我们将要随系统自动启动的脚本都放在此目录下),而是创建的链接文件S900test放在/etc/rc.d/rc3.d目录下。
    原因:
    1.运行级别:
    [root@rhel5 rc.d]# runlevel
    N 3

    2.inittab默认配置:
    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 (启动时会等待将/etc/rc.d/rc3.d目录下的所有命令执行完成。)
    l4:4:wait:/etc/rc.d/rc 4
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6

    方法三:
    这种方法跟上一种方法其实本质是相同的,都是源自inittab配置文件。
    可以直接修改/etc/inittab
    加入:
    test:35:wait:/bin/echo "123456" > /aaa 2>&1

    这样在启动时系统也会等待/bin/echo "123456"命令执行结束。

    注意:
    1.:wait:为关键字,意为等待命令执行结束。不要写成其他或者写错了。
    2.在使用命令或写执行脚本的时候,最后执行绝对路径。如/bin/echo 而不要光写个echo。

    ################

    查看初始运行级别:
    grep initdefault /etc/inittab

    检查系统自启动的程序
    aix:
    cat /etc/inittab
    ls -ltr /etc/rc.d/rc2.d

    linux
    cat /etc/inittab
    ls -ltr /etc/rc5.d


    hp:
    cat /etc/inittab
    ls -tlr /sbin/rc2.d

  • 相关阅读:
    1-4个人博客
    大二上学期软件工程概论学习进度表(第十六周)
    软件工程概论个人总结
    python+selenium 定位元素的主要方法
    python+selenium 元素定位--iframe
    返回字符串中出现最多的字符
    TestNG中 ITestListener 的使用
    对数组对象按某些属性排序方法
    OSX 10.11 cocoapods安装命令: sudo gem install -n /usr/local/bin cocoapods
    IOS启动页设置适应ios8/9
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/7810734.html
Copyright © 2011-2022 走看看