shell .sh 脚本不会执行其中的所有任务,除非手动运行

shell .sh 脚本不会执行其中的所有任务,除非手动运行

我在重新启动时运行 shell 脚本,将其放在 crontab 中:

@daily apt-get update && apt-get upgrade -y
@reboot bash /root/Start.sh
@reboot /bin/bash -c 'sleep 10 && /bin/mount -a'
...

shell 脚本被执行,因为它成功启动了其他 .py 脚本,但它不会从内部启动所有脚本(除了 Trouble.py 之外)。

但是,当我自己运行 shell 脚本时: bash Start.sh

.sh 中的所有脚本都会被执行。

这是我的 shell 脚本:

sleep 15
python3 /root/.../trouble.py > /root/error_log_bash.txt
python3 /root/.../working1.py &
python3 /root/.../working2.py &

到目前为止我已经尝试过:

  • 更改 .sh 中的顺序
  • 前后睡眠时间不同
  • chmod +x .py 脚本
  • 启动另一个类似的脚本,它按预期工作。
  • 检查error_log_bash.txt,但它是空的
  • sudo 在 .sh 中启动

由于它与另一个脚本一起使用,我正在考虑脚本是否有问题。然而,由于它是手动工作的,我发现这很难想象。我错过了什么吗?什么会引发这种行为?我正在以 root 身份使用 Debian。

#Edit @Waltinator 感谢您指出 cron 和常规环境之间的差异。当我使用手动控制台运行 sh /root/Start.sh 而不是 bash /root/Start.sh 时,我没有收到任何错误。

答案1

这更像是一条评论,而不是一个答案,但评论中只有这么多行

  1. 根本不清楚您想根据自己的情况实现什么目标。您已经解释过它不起作用,但不是您想要的。
  2. 您缺少脚本的第一行,该行应该用于识别您编写的代码的解释器。在你的情况下#!/bin/sh可能就足够了。
  3. 你没有捕捉到标准错误从 的输出trouble.py。这可能是问题,也可能不是问题,但除非你捕获它,否则你不会知道。
  4. 您根本没有从两个后台作业中捕获任何输出。
  5. 您没有捕获脚本的任何错误输出。例如,如果python3找不到,您将无法在任何有用的地方获得任何输出。

这是一个示例替换脚本:

#!/bin/sh
sleep 15
python3 /root/.../trouble.py  >/root/trouble.log 2>&1
python3 /root/.../working1.py >/root/working1.log 2>&1 &
python3 /root/.../working2.py >/root/working2.log 2>&1 &

这是发送所有输出的替代方案(标准输出标准错误对于脚本及其三个 Python 程序)到单个文件trouble.log

#!/bin/sh
sleep 15
exec >/root/trouble.log 2>&1

python3 /root/.../trouble.py
python3 /root/.../working1.py &
python3 /root/.../working2.py &

然后使脚本可执行:如果调用runit它就chmod a+rx runit可以了。现在您可以通过路径执行脚本,例如/root/runit

相关内容