已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP

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

作者: @Ta

时间: 2022-09-05发布,2022-09-05修改

点击: 2782

在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|隐藏机器人聊天)』

1. 看起来似乎是 golang 默认路径的问题,如果目录是固定的,用绝对路径可能解决问题
(/@Ta/2022-09-05 11:40//)

2.

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

#!/bin/sh
cd /path/to/xxx
./main
(/@Ta/2022-09-05 11:56//)

3.

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

(/@Ta/2022-09-05 11:58//)

4.

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

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

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

(/@Ta/2022-09-05 12:04//)

5.

@胡椒舰长,当然,还可以考虑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 12:07//)

6.

@胡椒舰长

尝试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 12:55//)

7. @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 13:46//)

8. @无名啊

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

9.

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

(/@Ta/2022-09-05 14:01//)

10.

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

(/@Ta/2022-09-05 16:07//)

11.

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

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

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

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

(/@Ta/2022-09-05 16:17//)

12.

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

(/@Ta/2022-09-05 16:19//)

回复需要登录

7月1日 19:16 星期二

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1