如何让linux开机自动运行命令,且执行时指定目录运行

@Ta 2022-09-05发布,2022-09-05修改 2785点击
在golang语言中,我规定了 ./main 的同级目录中 写入db.sqlite,

我希望 /root/main 运行后,写入/root/db.sqlite

我在alpine linux中的 /etc/local.d/gin.start 中写入 


尝试1:
nohup /root/main & //结果db.sqlite 写入到了/etc/local.d/ 目录中

尝试2: 
nohup sh -c "cd /root/main;sh" & //结果不运行

尝试3:

nohup sh /root/start.sh & //start.sh中 cd /root ; ./main  也不行


目前我打了一个docker镜像,在镜像中 workerdir 就ok
回复列表(12|隐藏机器人聊天)
  • @Ta / 2022-09-05 / /
    看起来似乎是 golang 默认路径的问题,如果目录是固定的,用绝对路径可能解决问题
  • @Ta / 2022-09-05 / /

    @胡椒舰长,写脚本进行包装啊

    #!/bin/sh
    cd /path/to/xxx
    ./main
    
  • @Ta / 2022-09-05 / /

    @胡椒舰长,注意,alpine可能没有/bin/bash
    如果遇到难以理解的脚本问题,可以用docker -it进shell手动执行调试。

  • @Ta / 2022-09-05 / /

    @胡椒舰长,为了减少参数传递导致的问题,可以把脚本设为可执行然后直接运行。

    nohup /root/start.sh >/dev/shm/xxx.log 2>&1 &
    

    然后你可以在xxx.log里检查发生了什么

  • @Ta / 2022-09-05 / /

    @胡椒舰长,当然,还可以考虑systemd服务。

    cat << EOF | sudo tee /etc/systemd/system/hu60.service >/dev/null
    [Unit]
    Description=hu60
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    Type=simple
    Restart=always
    RestartSec=1
    User=root
    WorkingDirectory=/root
    ExecStart=/root/main
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    sudo systemctl start hu60
    sudo systemctl enable hu60
    sudo journalctl -u hu60
    
  • @Ta / 2022-09-05 / /

    @胡椒舰长

    尝试2:
    nohup sh -c "cd /root/main;sh" & //结果不运行

    这是个啥。。cd 到一个文件?你会不会是想写:

    nohup sh -c "cd /root/ && ./main" &
    

    反正我在 Linux Deploy 里想自启应用,用的是 sysv,支持启动时切换 uid gid workdir。自启脚本长这样(节选)

    . /lib/lsb/init-functions
    
    case "$1" in
    	start)
    		log_daemon_msg 'Starting' "$NAME"
    		/sbin/start-stop-daemon --start --quiet --oknodo --chuid "$USER:$GROUP" --pidfile "$PIDFILE" --make-pidfile --chdir "$WORKDIR" --exec "$DAEMON" --background -- "${DAEMONARGS[@]}"
    		log_end_msg $?
    		;;
    
  • @Ta / 2022-09-05 / /
    @yiluo,路径 肯定不能固定,就是和main 程序同一个目录写文件。

    @老虎会游泳,我是希望开机自动启动, 因为alpien linux 在/etc/local.d/*.start 文件都会在开机的时候执行,

    我直接执行 ./main 貌似 好像是基于 /etc/local.d/运行目录,而不是 main所在的 /root目录

    我用nohup 他直接不执行,我怀疑是不是刚开机nohup服务都没启动,导致没执行的,

    我都是用是sh,不用bash。而且我的linux不是docker,我是把宿主机刷了alpine linux操作系统,因为宿主机内存只有512Mb,alpine linux 开机才50Mb
  • @Ta / 2022-09-05 / /
    @无名啊

    >nohup sh -c "cd /root/ && ./main" &
    这样也是不执行的,我试了 &&和 ; 
  • @Ta / 2022-09-05 / /

    @胡椒舰长,按老虎在 4楼 说的那样,瞅瞅日志呗

  • @Ta / 2022-09-05 / /

    @胡椒舰长,请看日志,不要猜测。
    还有,既然在/etc/local.d/*.start 文件都会在开机的时候执行,那么你何必加nohup,就算不加不也可以执行吗?

  • @Ta / 2022-09-05 / /

    @胡椒舰长,写入日志的方法:

    命令 >/var/log/xxx.log 2>&1
    

    猜测一千次不如看日志一次。

    其中2>&1用于把标准错误写入和标准输出相同的文件,并不表示后台运行。如果想后台运行,还是得自己在结尾加&

  • @Ta / 2022-09-05 / /

    @胡椒舰长,如果日志显示程序已经启动了,但是你看的时候程序却未在运行,说明不应该让程序后台运行。此时,删除nohup&就可以解决问题。

添加新回复
回复需要登录