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

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

  •  
  •   msmkls · 2023-10-21 12:45:29 +08:00 · 2128 次点击
    这是一个创建于 397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了个 sh 内容如下

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

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

    crontab 定时格式如下

    20 条回复    2023-10-22 15:06:18 +08:00
    seers
        1
    seers  
       2023-10-21 13:13:15 +08:00 via iPhone
    绝对路径
    msmkls
        2
    msmkls  
    OP
       2023-10-21 13:20:22 +08:00
    @seers 大佬能举个例子不,感谢
    eaststarpen
        3
    eaststarpen  
       2023-10-21 13:22:22 +08:00
    把路径写完就是了

    crontab 执行的适合环境和用户自己自己执行时不一样
    msmkls
        4
    msmkls  
    OP
       2023-10-21 13:23:47 +08:00
    @eaststarpen 就是没有搞明白这个问题,不知道该怎么写了
    msmkls
        5
    msmkls  
    OP
       2023-10-21 13:25:25 +08:00
    @eaststarpen 请问下有没有其他的定时方式达到用户自己执行的效果,感谢
    eaststarpen
        6
    eaststarpen  
       2023-10-21 13:28:06 +08:00
    如果你的脚本依赖于相对路径, 那就在脚本入口添加 cd 命令



    ```
    #!/bin/env bash

    set -e

    cd $WORING_DIRECTORY

    ......
    ```

    然后在 crontab 中使用绝对路径调用启动脚本
    eaststarpen
        7
    eaststarpen  
       2023-10-21 13:30:07 +08:00   ❤️ 1
    @msmkls 可以选择 systemd timer 比较强大/灵活
    msmkls
        8
    msmkls  
    OP
       2023-10-21 13:31:57 +08:00
    @eaststarpen 好的,感谢解答,我去尝试下
    samli12
        9
    samli12  
       2023-10-21 13:57:53 +08:00   ❤️ 1
    x x x x x /bin/bash xxx.sh
    msmkls
        10
    msmkls  
    OP
       2023-10-21 15:10:17 +08:00
    @samli12 这样写的话 ,请问路径不用写的吗
    churchmice
        11
    churchmice  
       2023-10-21 15:26:11 +08:00   ❤️ 1
    同学,这个问题是这样的,
    比如你的 xxx.sh 脚本里面有这样的话
    ls
    cat
    xxx

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

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


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

    程序依赖 PATH 变量去寻找对应的命令
    Ivtdny75
        15
    Ivtdny75  
       2023-10-21 18:25:23 +08:00   ❤️ 1
    这种问题感觉特别适合 GPT 回答。很多类似问题我也是找 GPT ,挺方便的,推荐下和 GPT 结对开发。
    weiiai
        16
    weiiai  
       2023-10-22 00:02:31 +08:00
    假设所有环境变量写在/etc/profile ,可以在 crontab 里 source 执行。
    0 1 * * * source /etc/profile;/bin/bash /path/xx.sh > /dev/null 2>&1 &
    msmkls
        17
    msmkls  
    OP
       2023-10-22 09:18:18 +08:00
    @Ivtdny75 确实,不过我发现这个执行文件也需要配置环境
    msmkls
        18
    msmkls  
    OP
       2023-10-22 09:18:52 +08:00
    @weiiai 感谢,都没你这个回复直观
    julyclyde
        19
    julyclyde  
       2023-10-22 13:07:55 +08:00
    @weiiai 首先你这个假设就不对
    其次 profile 是为 login shell 提供环境的。non login 不应该用这个
    humbass
        20
    humbass  
       2023-10-22 15:06:18 +08:00
    作为一名非专业运维,一般我是单独给一个目录放 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 &
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   983 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:00 · PVG 06:00 · LAX 14:00 · JFK 17:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.