【发布时间】:2021-11-07 00:55:02
【问题描述】:
所以我有这个 shell 脚本,我认为它应该运行给定次数,休眠然后恢复,并将结果输出到日志文件
#!/bin/bash
log=/path/to/file/info.log
a=$(COMMAND1 | cut -d : -f 2)
b=$(COMMAND2 | grep VALUE| cut -c 7,8)
for i in {1..4}
do
echo "Test" $i >> $log
date >> $log
echo $a >> $log
echo "$((-113 + (($b * 2)))) VALUE" >> $log
sleep 60
done
当我运行ps -ef | grep scriptname.sh 时,脚本似乎确实运行了。执行一次然后 PID 消失,就像运行完成一样。
我已经测试了脚本并且知道它正在运行并捕获我想要的数据。但我不明白为什么它不递增,也不知道为什么它的结束比预期的要早。
info.log 输出样本
Test {1..4}
DATE IN UTC
EXPECTED VALUE OF a
EXPECTED VALUE OF b
请注意,正如我所料,输出实际上是“Test {1..4}”而不是“Test 1”“Test 2”Test 3”等等。
我以./scriptname.sh & 和/path/to/file/scriptname.sh & 运行脚本
我已经读到使用sh 和bash 运行脚本是有区别的,尽管我不完全理解这会对脚本产生什么影响。我根本不是软件人。
如果我关闭终端,我尝试使用nohup 运行脚本以使其在后台运行。我还认为命令中的& 应该让脚本在后台运行。脚本似乎仍然没有继续运行
我之前问过这个问题,它被关闭了,理由是它类似于一篇关于 sh 和 bash 之间区别的帖子......但这不是我的主要问题。
echo "$BASH_VERSION" 也没有返回任何内容,一个空行。 echo "$-" 返回 smi,我不知道这意味着什么。但bash --version 返回:
BusyBox v1.17.1 (2019-11-26 10:41:00 PST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
所以我的问题是:
-
如果使用
sh运行脚本 - 是否使用./scriptname.sh &完成并使用 bash 运行脚本是/path/to/file/scriptname.sh &...如果是这样,这对脚本代码的处理方式有什么影响?即 - 使用sh或bash。我不完全理解两者之间的区别 -
为什么当我关闭终端时脚本不能继续运行?这是我最关心的问题。我想在一段时间内每小时运行一次这个脚本。每次我尝试某事并返回时,我都会在日志中获得一个实例。
【问题讨论】:
-
你没有运行 Bash,你的
/bin/bash指向 ash,一个最小的 POSIX 兼容 shell。并且ash不支持大括号展开;你必须改用for i in 1 2 3 4之类的东西。 -
@BenjaminW。是正确的。如果重复次数需要是动态的,你也可以去
for i in $(seq 1 4),比如max=5; for i in $(seq 1 $max) -
回答您的问题:1) 根据 BenjaminW,您既没有运行
sh也没有运行bash,因为您的系统正在用ash替换这些命令。这是你问题的核心。使用相对路径还是绝对路径来调用脚本并不重要。 2)ash不理解{1..4}语法,因此它将其视为单个参数并使用完整的“{1..4}”字符串而不是您想要的数字运行一次。使用上面的建议,它会像你期望的那样循环多次;如果您在后台使用&启动它,它应该会在您注销后继续运行。 -
@BenjaminW。因此,要保持此脚本运行,我需要做的就是更改我的“for”语句以省略大括号?所以像'i in 1 2'之类的,直到我希望它运行的次数?
-
那个,或者根据 Jeff 的建议使用
seq;seq包含在busybox 中。