Arm Linux 新增开机自启动一个程序实例

打开开机启动文件(shell 脚本), 每个板子可能有不同的Linux内核, 故启动文件名称不一样
例如:
/etc/init.d/rcS
/etc/init.d/rc.local
/etc/profile
/usr/etc/rc.local
我的板子上是 “/etc/init.d/rcS” 这个文件名称。

一、开机自启动程序设置的两种方法

1.1     在 /etc/init.d/rcS   文件中添加需要自启动程序(方案一)

 

即在shell中 执行一个可执行文件, 进入到绝对路径, ./可执行文件名称 即可, 例如:

cd /apps
./hello

 

1.2 在 /etc/init.d/ 路径中添加一个shell脚本(方案二)


创建了init进程, init进程执行init.d解释/etc/inittab, 这个就会去执行/etc/init.d中有一个rcS的脚本, 这个脚本是for循环, 找到/etc/init.d中以S打头的至少俩个字符的脚本, 然后执行这个脚本;

 

二、实例演示

2.1 系统预定义启动脚本文件 /etc/init.d/rcS

[root@EPC-9600 init.d]#  cat /etc/init.d/rcS

#!/bin/sh

mkdir -p /var/{run,log,lock,empty,lib/dbus} 2> /dev/null

# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
    # Ignore dangling symlinks (if any).
    [ ! -f "$i" ] && continue

    case "$i" in
        *.sh)
            # Source shell script for speed.
            (
            trap - INT QUIT TSTP
            set start
            . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i start
            ;;
    esac
done

if [[ -d /opt/etc/init.d ]]; then
    for i in /opt/etc/init.d/S??* ;do
        # Ignore dangling symlinks (if any).
        [ ! -f "$i" ] && continue

        case "$i" in
            *.sh)
                # Source shell script for speed.
                (
                trap - INT QUIT TSTP
                set start
                . $i
                )
                ;;
            *)
                # No sh extension, so fork subprocess.
                $i start
                ;;
        esac
    done
fi

 

2.2 用户新增启动脚本文件  /opt/etc/init.d/S80Hello

[root@EPC-9600 ~]# chmod a+x  /opt/melon/bin/hello.bin
[root@EPC-9600 ~]# touch  /opt/ect/init.d/S80ecpud
[root@EPC-9600 ~]# chmod a+x   /opt/etc/init.d/S80ecpud
[root@EPC-9600 ~]# cat /opt/etc/init.d/S80ecpud

#!/bin/sh

if [[ -x /opt/melon/bin/hello.bin ]]; then
        echo -n "Starting hello.bin: "
        /opt/melon/bin/hello.bin  -l /bin/login &> /opt/melon/logs/melon.log
        if [[ "$?" -eq "0" ]]; then
                echo "OK"
        else
                echo "Failed"
        fi
fi

 

三、标准输入/出、重定向与跟踪

3.1 文件句柄

句柄0:标准输入stdin,键盘输      //标准输入(standard input)文件描述符 0
句柄1:标准输出stdout            //标准输出(standard output) 1
句柄2:标准错误stderr            //标准错误(standard error) 2

 

重定向操作符               描述
     >                      将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。
     <                      从文件而不是从键盘或句柄读入命令输入。
     >>                    将命令输出添加到文件末尾而不删除文件中已有的信息。
     >&                    将一个句柄的输出写入到另一个句柄的输入中。
     <&                    从一个句柄读取输入并将其写入到另一个句柄输出中。
     |                       从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

 

3.2 >覆盖和>>追加 都重定向输出

命令 > 文件   覆盖:这个输出重定向符是直接覆盖原有的内容
命令 >> 文件  追加:则是在文件末尾追加内容

3.3 完整格式

命令 1> 文件   表示的是"标准输出"重定向,其中1可以省略,> 同样表示
命令 2> 文件   表示的是"标准错误"输出重定向
命令 > 文件 2>&1  表示的是"把标准错误输出重定向到标准输出"  , 符号 >& 是一个整体,不可分开,分开后就不是上述含义了。写在log文件后面
命令 > 文件 1>&2  表示的是"把标准输出重定向到标准错误输出"(注意>后面要加&才能表示输出到2通道标准错误输出通道,如果没有&,表示输出到2文件了)
文件 < 文件   这是输入重定向符,表示从<后面的地方读取输入到<前面。所以4<&0表示的是把键盘输入的东西输入到文件4中

举例-1: hello.bin 1>> log.txt  2>&1

解释:将正确和错误的信息都输入到log.txt文件中

举例-2: < 可以将原本由标准输入改为由指定地方输入,比如下面

 首先创建一个hh文件,里面写入hello world

然后执行 >> txt.py < hh
就可以把hh里面的内容写入到txt.py

 

3.4 简写格式

&> log
>& log

上面两种方式都和"命令 > 文件 2>&1"  一个语义。
上面两种方式中&>和>&有区别吗?——语义上是没有任何区别的,但是第一中方式是最佳选择,一般使用第一种

 3.5 日志跟踪t显示tail

tail  -f  -n 10 log.txt

-f

动态输出文本内容,通俗讲就是对文件进行监控,当文本产生内容更新时,它就会直接写入标准输出,文件被删除自动停止。
-F
与-f功能相同。
差别在于,当文件被删除后,-f会停止,-F会等待。

-n

tail -n 5 log.txt     // 输出文件尾部5行
tail -n +5 log.txt    // 从第5行开始到文件尾部进行输出
tail -10 log.txt      // 在字符'-'之后紧跟数字,默认按行数处理

 

posted @ 2023-09-22 14:08  suntroop  阅读(1816)  评论(0)    收藏  举报