CentOS7 需要在开机时执行一个一次性脚本,请问如何操作? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
LxnChan
V2EX    Linux

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

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

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

    现在有以下几种方案:

    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
      &nbs; 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
    DonaidTrump
        17
    DonaidTrump  
       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     Solana     1433 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 16:51 PVG 00:51 LAX 09:51 JFK 12:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86