小白问个 crontab 定时任务执行的问题

337 天前
 msmkls

写了个 sh 内容如下

#!/bin/bash cd /srv/FileServerWeb nohup ./FileServerWeb > /dev/null 2>&1 &

在 ssh 进入目录下执行./xxx.sh 可以执行成功 但是放到 crontab 定时里,却执行不成功,是我哪里写的有问题吗,请大佬指正,十分感谢

crontab 定时格式如下

2050 次点击
所在节点    Linux
20 条回复
seers
337 天前
绝对路径
msmkls
337 天前
@seers 大佬能举个例子不,感谢
eaststarpen
337 天前
把路径写完就是了

crontab 执行的适合环境和用户自己自己执行时不一样
msmkls
337 天前
@eaststarpen 就是没有搞明白这个问题,不知道该怎么写了
msmkls
337 天前
@eaststarpen 请问下有没有其他的定时方式达到用户自己执行的效果,感谢
eaststarpen
337 天前
如果你的脚本依赖于相对路径, 那就在脚本入口添加 cd 命令



```
#!/bin/env bash

set -e

cd $WORING_DIRECTORY

......
```

然后在 crontab 中使用绝对路径调用启动脚本
eaststarpen
337 天前
@msmkls 可以选择 systemd timer 比较强大/灵活
msmkls
337 天前
@eaststarpen 好的,感谢解答,我去尝试下
samli12
337 天前
x x x x x /bin/bash xxx.sh
msmkls
337 天前
@samli12 这样写的话 ,请问路径不用写的吗
churchmice
337 天前
同学,这个问题是这样的,
比如你的 xxx.sh 脚本里面有这样的话
ls
cat
xxx

反正就是命令,那 shell 是如何去找这些命令的呢?答案是 PATH 变量,你可以 echo $PATH 看一下里面的路径

一个用户登录系统的时候一般 PATH 变量都是系统给你初始化好了,所以你可以直接敲 ls,而不是/bin/ls


但是 crontab 里面是没人帮你设置 PATH 变量的,所以会出现命令找不到的情况
所以一般做法是在 xxx.sh 开头会写上
export PATH= balbablabss
msmkls
337 天前
@churchmice 感谢解答,让我明白他的运行方式,刚接触脚本和定时有些定时脚本就能执行,有些不行就很纳闷,感谢,那请问下,/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.dotnet/tools:/root/.dotnet/tools/:/root/bin 按照您的回复我查询了下变量,请问下如果我要执行问题中的脚本,我是需要添加变量,还是引入变量,小白问题勿怪哈,能帮忙写下吗,我能参考学习起来可能更快,感谢
msmkls
337 天前
@churchmice 变量的意思,我拿宝塔面板来理解的话,是不是说输入 bt 就会有菜单出现,也是安装时写入的变量吧,定义了 bt 的路径,意思也就是说在.sh 里我也要给它相应的变量路径,能这么理解吗
churchmice
337 天前
@msmkls #13 你一个宝塔面板启动的时候会继承当前进程里面的环境变量,当然也包括了 PATH 变量

程序依赖 PATH 变量去寻找对应的命令
Ivtdny75
337 天前
这种问题感觉特别适合 GPT 回答。很多类似问题我也是找 GPT ,挺方便的,推荐下和 GPT 结对开发。
weiiai
337 天前
假设所有环境变量写在/etc/profile ,可以在 crontab 里 source 执行。
0 1 * * * source /etc/profile;/bin/bash /path/xx.sh > /dev/null 2>&1 &
msmkls
336 天前
@Ivtdny75 确实,不过我发现这个执行文件也需要配置环境
msmkls
336 天前
@weiiai 感谢,都没你这个回复直观
julyclyde
336 天前
@weiiai 首先你这个假设就不对
其次 profile 是为 login shell 提供环境的。non login 不应该用这个
humbass
336 天前
作为一名非专业运维,一般我是单独给一个目录放 crontab 的文件如 /opt/shell/xxx.sh

xxx.sh 里头只有一个原则,所有路径要写全,比如

#!/bin/bash cd /srv/FileServerWeb nohup ./FileServerWeb > /dev/null 2>&1 &

改写成

#!/bin/bash

pushd /path/to/your-service-folder/
./xxx.sh > /dev/null 2>&1 &

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/984021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX