V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
LxnChan
V2EX  ›  Linux

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

  •  1
     
  •   LxnChan ·
    lxnchan · 2022-10-18 10:27:09 +08:00 · 4144 次点击
    这是一个创建于 801 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    现在有以下几种方案:

    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
    
    第 1 条附言  ·  2022-10-18 14:30:26 +08:00

    已解决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。

    第 2 条附言  ·  2022-10-18 14:31:04 +08:00
    上面写错了,特别感谢的是 6F 和 15F
    28 条回复    2022-10-21 15:18:45 +08:00
    linxi09
        1
    linxi09  
       2022-10-18 10:33:11 +08:00
    /home/tsh2/my.sh 是不是 给了执行全县
    zengxs
        2
    zengxs  
       2022-10-18 10:33:19 +08:00
    crontab @reboot
    LxnChan
        3
    LxnChan  
    OP
       2022-10-18 10:35:39 +08:00
    @linxi09 肯定是有执行权限的,单独执行是可以执行的
    @zengxs crontab 不成定时执行了吗
    jasonyang9
        4
    jasonyang9  
       2022-10-18 10:37:54 +08:00 via Android
    systemd 的 Timer ,OnBootSec 。另外具体的错误是啥
    LxnChan
        5
    LxnChan  
    OP
       2022-10-18 10:41:08 +08:00
    @jasonyang9 没有具体错误,`systemctl start myser.service`没有输出,`systemctl status myser`输出就是正常脚本的执行输出,没有报错。
    另外请教一下 Timer 是什么,我猜会不会是 Type=oneshot ,该脚本创建好子进程之后切到后台,systemd 以为执行完了就把脚本连着的子进程全给 kill 了
    eason1874
        6
    eason1874  
       2022-10-18 10:54:24 +08:00   ❤️ 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  
       2022-10-18 10:55:26 +08:00
    type 改 simple
    doubtlhy
        8
    doubtlhy  
       2022-10-18 10:58:01 +08:00 via iPhone
    要让 /etc/rc.local 开机执行需要添加可执行权限 chmod +x /etc/rc.d/rc.local
    mijazz
        9
    mijazz  
       2022-10-18 11:00:40 +08:00
    确定用户和组的权限之后, `Type`改成`simple`或者`forking`, 具体参考 systemd 的文档.
    jasonyang9
        10
    jasonyang9  
       2022-10-18 11:04:09 +08:00 via Android
    @LxnChan 建议看看 systemd 的相关文档。这里搜了一篇 https://wiki.archlinux.org/title/systemd/Timers
    bao3
        11
    bao3  
       2022-10-18 11:11:36 +08:00
    其实 rc.local 挺好的,结果过渡到 systemd 后给弄没了,非要自己想办法创建。
    我现在自己装的 debian ,脚本里要做的就是先把 rc.local 弄好。很多一次性脚本,用这个还是很方便的。
    jasonyang9
        12
    jasonyang9  
       2022-10-18 11:24:34 +08:00 via Android
    理解错了,忽略我的回复。lz 的需求不涉及到 timer 的,直接 enable 这个服务单元即可,普通的 systemd 服务单元,执行一个脚本
    zer0z
        13
    zer0z  
       2022-10-18 11:37:07 +08:00
    8 楼说的对。
    rc.local 文件中应该有默认提示的,要给 rc.local 加可执行权限。
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    ysc3839
        14
    ysc3839  
       2022-10-18 12:33:19 +08:00 via Android   ❤️ 1
    @LxnChan #5 “`systemctl status myser`输出就是正常脚本的执行输出,没有报错”
    那为什么一开始说会报错呢?到底有什么问题?
    zerone0086
        15
    zerone0086  
       2022-10-18 12:37:12 +08:00   ❤️ 2
    shi'sh 试试,不知道对你有没有用
    cattyhouse
        16
    cattyhouse  
       2022-10-18 12:45:18 +08:00 via iPhone
    crontab -e

    @reboot /path/to/script
    tulongtou
        17
    tulongtou  
       2022-10-18 12:56:55 +08:00 via iPhone
    @LxnChan reboot 是开机执行一次,不是定时执行
    julyclyde
        18
    julyclyde  
       2022-10-18 13:04:41 +08:00
    如果是后台服务的话,似乎不应该用“一次性”这种词啊

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

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

    用 local ,权限解决了?

    你这种情况 用特定用户和组的 crontan @reboot 是最佳答案。16f
    LxnChan
        24
    LxnChan  
    OP
       2022-10-18 14:47:45 +08:00
    @cattyhouse 权限可以解决啊

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

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

    rc.local 的权限需要确认。很多刚安装的系统的这个文件是没有执行权限的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5402 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:47 · PVG 16:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.