我在重新启动时运行 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
这更像是一条评论,而不是一个答案,但评论中只有这么多行
- 根本不清楚您想根据自己的情况实现什么目标。您已经解释过它不起作用,但不是您想要的。
- 您缺少脚本的第一行,该行应该用于识别您编写的代码的解释器。在你的情况下
#!/bin/sh
可能就足够了。 - 你没有捕捉到标准错误从 的输出
trouble.py
。这可能是问题,也可能不是问题,但除非你捕获它,否则你不会知道。 - 您根本没有从两个后台作业中捕获任何输出。
- 您没有捕获脚本的任何错误输出。例如,如果
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