为什么我的bash脚本不能正确运行?

问题描述:

我有一个简单的脚本,在终端中工作正常,但不是在init.d脚本或crontab中。我正在研究覆盆子pi。为什么我的bash脚本不能正确运行?

是否有编写脚本在后台运行的规则?

这是我的脚本:

#!/bin/bash 
while true; do echo "ALIVE" | sudo nc -l -p 80; done 
+0

当您运行该脚本时,您可能必须在'sudo'调用​​中输入密码。你如何做到这一点在crontab或init.d? – RedX 2015-03-03 07:39:02

+0

[使用netcat与-p选项]的可能重复(http://stackoverflow.com/questions/16196438/using-netcat-with-p-option) – alfasin 2015-03-03 07:41:38

+1

@alfasin这不是一个有效的副本。 – tripleee 2015-03-03 09:23:29

  1. 运行脚本的用户必须能够须藤。使用visudo命令进行配置。

  2. 您应该检查输出/错误。你可以做到这一点,改成:

    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 
  1. 您应该检查脚本开始的。添加echo Script started >> the-log-file; date >> the-log-file。如果脚本没有启动,请确保它被标记为可执行文件。如果脚本启动,请确保脚本不会导致系统崩溃 - 系统是否需要此脚本返回?因为它目前不是后台守护进程。它不会完成,也不会将控制权返回给shell。尝试更换while truefor count in 1 2进行测试,只执行两次。在/etc/crontab/etc/cron.d或经由 crontab -e
  2. 定义
开始=“3”>
+1

如果你用完'init.d',你已经是'root',不需要'sudo'。 – tripleee 2015-03-03 08:30:29

+0

@tripleee OP从“init.d或crontab”运行它。这意味着有必要涵盖所有的基地,国际海事组织。 – piojo 2015-03-03 10:25:19

  1. 的Cron脚本可以作为用户比root其他运行。所有权限 (例如日志文件)和授权信息(您的情况sudoers)必须相应地设置为 。

  2. 如果他们不包含Shebang线,cron脚本可以在不同的外壳运行,根据脚本运行的用户(见壳/etc/passwd设置)。 shell也可以通过crontab中的SHELL变量覆盖。这与OP的脚本无关。

  3. 壳运行init.dcron脚本可以是使用不同 环境。最值得注意的是PATH可能不同,所以建议仅使用绝对路径或根据需要设置PATH

+1

关于#2,OP的脚本在脚本的顶部有bash shebang,可疑的shell将运行脚本。这会破坏各种各样的东西,比如二进制可执行文件。这实际上是一个问题吗? – piojo 2015-03-03 08:55:53

+1

@piojo当然你是对的。我所见过的大多数cron和init.d脚本都有shebang行,并且在脚本执行时它具有优先权。然而,shebang不是必需的,所以对于一般调试,这应该被考虑。我会编辑我的答案来指出这一点。 – 2015-03-03 09:20:02