Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
LxnChan
V2EX  ›  Linux

CentOS7 需要在开机时执行一个一次性脚本,请问如何操作?

  •  1
     
  •   LxnChan ·
    lxnchan · Oct 18, 2022 · 5793 views
    This topic created in 1488 days ago, the information mentioned may be changed or developed.

    现有一个一次性脚本,需要在开机时以特定用户和组执行(执行后该脚本相当于以后台守护的方式执行)。

    现在有以下几种方案:

    1. rc.local:写进去是写进去了但是不知道为什么死活不生效。
    2. SystemD:创建了 Service 配置文件,但是会报错,也没有正确启动。

    目前已经确认的是rc.local已经加了对应的权限:

    [root@testbench-C ~]# ll /etc/rc.local
    lrwxrwxrwx. 1 root root 13 Sep 18 23:46 /etc/rc.local -> rc.d/rc.local
    [root@testbench-C ~]# ll /etc/rc.d/rc.local
    -rwxr--r--. 1 root root 542 Oct 17 22:04 /etc/rc.d/rc.local
    

    SystemD 配置文件:

    [Unit]
    Description=myservice
    After=syslog.target
    After=network.target
    
    [Service]
    Type=oneshot
    User=myuser
    Group=myuser
    ExecStart=/home/tsh2/my.sh start
    
    [Install]
    WantedBy=multi-user.target
    
    Supplement 1  ·  Oct 18, 2022

    已解决rc-local无法自启动的问题,感谢6F和15F,rc.local(rc-local)本身也是个Service,受SystemD管理,需要先行开启。

    systemctl enable rc-local
    chmod +x /etc/rc.local
    chmox +x /etc/rc.d/rc.local
    

    再次感谢本帖中帮助我的人,特别感谢6F和12F。

    Supplement 2  ·  Oct 18, 2022
    上面写错了,特别感谢的是 6F 和 15F
    28 replies  •  2022-10-21 15:18:45 +08:00
    linxi09
    linxi09
    Oct 18, 2022
    1
    /home/tsh2/my.sh 是不是 给了执行全县
    zengxs
    zengxs
    Oct 18, 2022
    2
    crontab @reboot
    LxnChan
    LxnChan
    OP
    Oct 18, 2022
    3
    @linxi09 肯定是有执行权限的,单独执行是可以执行的
    @zengxs crontab 不成定时执行了吗
    jasonyang9
    jasonyang9
    Oct 18, 2022 via Android
    4
    systemd 的 Timer ,OnBootSec 。另外具体的错误是啥
    LxnChan
    LxnChan
    OP
    Oct 18, 2022
    5
    @jasonyang9 没有具体错误,`systemctl start myser.service`没有输出,`systemctl status myser`输出就是正常脚本的执行输出,没有报错。
    另外请教一下 Timer 是什么,我猜会不会是 Type=oneshot ,该脚本创建好子进程之后切到后台,systemd 以为执行完了就把脚本连着的子进程全给 kill 了
    eason1874
    eason1874
    Oct 18, 2022❤️2
    6
    rc-local 也是一个服务,也需要设置开机启动 systemctl enable rc-local

    用 systemd 的话,不能省略 shell 程序路径吧 ExecStart=/bin/bash /home/tsh2/my.sh start

    还有,改完 service 文件记得执行 sudo systemctl daemon-reload
    eason1874
    eason1874
    Oct 18, 2022
    7
    type 改 simple
    doubtlhy
    doubtlhy
    Oct 18, 2022 via iPhone
    8
    要让 /etc/rc.local 开机执行需要添加可执行权限 chmod +x /etc/rc.d/rc.local
    mijazz
    mijazz
    Oct 18, 2022
    9
    确定用户和组的权限之后, `Type`改成`simple`或者`forking`, 具体参考 systemd 的文档.
    jasonyang9
    jasonyang9
    Oct 18, 2022 via Android
    10
    @LxnChan 建议看看 systemd 的相关文档。这里搜了一篇 https://wiki.archlinux.org/title/systemd/Timers
    bao3
    bao3
    Oct 18, 2022
    11
    其实 rc.local 挺好的,结果过渡到 systemd 后给弄没了,非要自己想办法创建。
    我现在自己装的 debian ,脚本里要做的就是先把 rc.local 弄好。很多一次性脚本,用这个还是很方便的。
    jasonyang9
    jasonyang9
    Oct 18, 2022 via Android
    12
    理解错了,忽略我的回复。lz 的需求不涉及到 timer 的,直接 enable 这个服务单元即可,普通的 systemd 服务单元,执行一个脚本
    zer0z
    zer0z
    Oct 18, 2022
    13
    8 楼说的对。
    rc.local 文件中应该有默认提示的,要给 rc.local 加可执行权限。
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    ysc3839
    ysc3839
    Oct 18, 2022 via Android❤️1
    14
    @LxnChan #5 “`systemctl status myser`输出就是正常脚本的执行输出,没有报错”
    那为什么一开始说会报错呢?到底有什么问题?
    zerone0086
    zerone0086
    Oct 18, 2022❤️2
    15
    shi'sh 试试,不知道对你有没有用
    cattyhouse
    cattyhouse
    Oct 18, 2022 via iPhone
    16
    crontab -e

    @reboot /path/to/script
    DonaidTrump
    DonaidTrump
    Oct 18, 2022 via iPhone
    17
    @LxnChan reboot 是开机执行一次,不是定时执行
    julyclyde
    julyclyde
    Oct 18, 2022
    18
    如果是后台服务的话,似乎不应该用“一次性”这种词啊

    systemd 里 one-shot 是“执行之后会很快完成”的那种
    rayn32
    rayn32
    Oct 18, 2022
    19
    使用 systemd 控制的化,可以用 systemd 服务开机自启, 而不是用 rc.local
    设置开机自动启动命令
    systemctl enable serviceName
    yanqiyu
    yanqiyu
    Oct 18, 2022
    20
    > 执行后该脚本相当于以后台守护的方式执行
    这种情况下应该是 Type=simple
    oneshot 的话 systemd 会预期你的脚本在一段时间之后退出并干掉所有子进程
    LxnChan
    LxnChan
    OP
    Oct 18, 2022
    22
    @doubtlhy @zer0z 麻烦审题,已经给过权限了,而且我也贴出对应文件的权限了
    @ysc3839 因为这脚本并非是一直运行的那种,脚本内实现的是类似于 nohup 的原理,因此正常来说脚本确认程序已在后台运行就会自动退出。现在的情况是脚本返回正常运行了,但是从脚本启动的后台程序并没有在运行。
    @yanqiyu 我现在也是觉得是这个原因,惭愧的是我看的也是这篇文档
    ---
    @zerone0086 @eason1874 谢谢,是有效的,确实依 6 楼和 15 楼所说 rc-local 也是个服务。
    ---
    @bao3 确实,感觉现在这个 rc-local 有点脱裤子放屁了,本身是控制自启的脚本,居然还得先开启自启脚本的自启动。
    cattyhouse
    cattyhouse
    Oct 18, 2022 via iPhone
    23
    没看出来你解决了什么

    需要在开机时以特定用户和组执行

    用 local ,权限解决了?

    你这种情况 用特定用户和组的 crontan @reboot 是最佳答案。16f
    LxnChan
    LxnChan
    OP
    Oct 18, 2022
    24
    @cattyhouse 权限可以解决啊

    ```sh
    su - <user> -c '/home/tsh2/my.sh start'
    ```
    julyclyde
    julyclyde
    Oct 18, 2022
    25
    @LxnChan 有些脚本是 root 权限初始化,再降级运行实际服务程序的
    这种情况不能直接指定以低权限运行

    转 systemd 的话,需要费点心改写
    LxnChan
    LxnChan
    OP
    Oct 18, 2022
    26
    @julyclyde 确实,不过其他解决方案上面也说了,对应用户的 crontab 或者干脆 systemd
    ysc3839
    ysc3839
    Oct 18, 2022 via Android
    27
    @LxnChan 那你应该把脚本改成持续运行的模式
    zuijiapangzi
    zuijiapangzi
    Oct 21, 2022
    28
    开头把环境变量协商。
    #!/bin/bash
    在加载下 /etc/profile
    source /etc/profile

    rc.local 的权限需要确认。很多刚安装的系统的这个文件是没有执行权限的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1016 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    ♥ Do have faith in what you're doing.