为什么我的bash脚本不能正确运行?
我有一个简单的脚本,在终端中工作正常,但不是在init.d脚本或crontab中。我正在研究覆盆子pi。为什么我的bash脚本不能正确运行?
是否有编写脚本在后台运行的规则?
这是我的脚本:
#!/bin/bash
while true; do echo "ALIVE" | sudo nc -l -p 80; done
运行脚本的用户必须能够须藤。使用
visudo
命令进行配置。-
您应该检查输出/错误。你可以做到这一点,改成:
while true; do echo "ALIVE" | sudo nc -l -p 80 &>/var/log/netcat-test.log; done
注意,你应该写日志到该用户确实具有访问权限的地方,一个已经存在的目录。但是由于写了很多很多的日志,这会损坏你的磁盘。我建议增加延迟:
while true; do echo "ALIVE" | sudo nc -l -p 80 &>>/var/log/netcat-test.log; sleep 30; done
- 您应该检查脚本开始的。添加
echo Script started >> the-log-file; date >> the-log-file
。如果脚本没有启动,请确保它被标记为可执行文件。如果脚本启动,请确保脚本不会导致系统崩溃 - 系统是否需要此脚本返回?因为它目前不是后台守护进程。它不会完成,也不会将控制权返回给shell。尝试更换while true
与for count in 1 2
进行测试,只执行两次。在/etc/crontab
,/etc/cron.d
或经由crontab -e
定义
的Cron脚本可以作为用户比
root
其他运行。所有权限 (例如日志文件)和授权信息(您的情况sudoers
)必须相应地设置为 。如果他们不包含Shebang线,cron脚本可以在不同的外壳运行,根据脚本运行的用户(见壳
/etc/passwd
设置)。 shell也可以通过crontab中的SHELL
变量覆盖。这与OP的脚本无关。壳运行
init.d
和cron
脚本可以是使用不同 环境。最值得注意的是PATH
可能不同,所以建议仅使用绝对路径或根据需要设置PATH
。
关于#2,OP的脚本在脚本的顶部有bash shebang,可疑的shell将运行脚本。这会破坏各种各样的东西,比如二进制可执行文件。这实际上是一个问题吗? – piojo 2015-03-03 08:55:53
@piojo当然你是对的。我所见过的大多数cron和init.d脚本都有shebang行,并且在脚本执行时它具有优先权。然而,shebang不是必需的,所以对于一般调试,这应该被考虑。我会编辑我的答案来指出这一点。 – 2015-03-03 09:20:02
当您运行该脚本时,您可能必须在'sudo'调用中输入密码。你如何做到这一点在crontab或init.d? – RedX 2015-03-03 07:39:02
[使用netcat与-p选项]的可能重复(http://stackoverflow.com/questions/16196438/using-netcat-with-p-option) – alfasin 2015-03-03 07:41:38
@alfasin这不是一个有效的副本。 – tripleee 2015-03-03 09:23:29