V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
LxnChan
V2EX  ›  Linux

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

  •  1
     
  •   LxnChan ·
    lxnchan · Oct 18, 2022 · 5116 views
    This topic created in 1291 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
        1
    linxi09  
       Oct 18, 2022
    /home/tsh2/my.sh 是不是 给了执行全县
    zengxs
        2
    zengxs  
       Oct 18, 2022
    crontab @reboot
    LxnChan
        3
    LxnChan  
    OP
       Oct 18, 2022
    @linxi09 肯定是有执行权限的,单独执行是可以执行的
    @zengxs crontab 不成定时执行了吗
    jasonyang9
        4
    jasonyang9  
       Oct 18, 2022 via Android
    systemd 的 Timer ,OnBootSec 。另外具体的错误是啥
    LxnChan
        5
    LxnChan  
    OP
       Oct 18, 2022
    @jasonyang9 没有具体错误,`systemctl start myser.service`没有输出,`systemctl status myser`输出就是正常脚本的执行输出,没有报错。
    另外请教一下 Timer 是什么,我猜会不会是 Type=oneshot ,该脚本创建好子进程之后切到后台,systemd 以为执行完了就把脚本连着的子进程全给 kill 了
    eason1874
        6
    eason1874  
       Oct 18, 2022   ❤️ 2
    rc-local 也是一个服务,也需要设置开机启动 systemctl enable rc-local

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

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

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

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

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

    用 local ,权限解决了?

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

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

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

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