Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash &引用;“不明确的重定向”;或“是”:没有这样的文件或目录;尝试在循环时保存';输出到文件_Bash - Fatal编程技术网

Bash &引用;“不明确的重定向”;或“是”:没有这样的文件或目录;尝试在循环时保存';输出到文件

Bash &引用;“不明确的重定向”;或“是”:没有这样的文件或目录;尝试在循环时保存';输出到文件,bash,Bash,我有这个剧本: #!/bin/bash while true; do mkdir -p ./err_logs mkdir -p ./out_logs echo "starting main from bash"; >&2 echo "starting main from bash" python3 main.py; echo "done running main sleeping"; sleep 10; echo

我有这个剧本:

#!/bin/bash

while true; 
do 
mkdir -p ./err_logs
mkdir -p ./out_logs
echo "starting main from bash";
>&2 echo "starting main from bash"
python3 main.py;
echo "done running main sleeping"; 
sleep 10;
echo "list of remaining python processes: ";
ps -ax | grep python;
echo "closing all of the remaining processes.";
ps ax | grep "python" | grep -v grep | awk '{print $1}' | xargs kill;
echo "done closing subprocesses";
err_path=$(realpath ./err_logs)
out_path=$(realpath ./out_logs)
err_log_path="${err_path}/err_$(date +"%d_%m").log"
out_log_path="${out_path}/out_$(date +"%d_%m").log"
echo "-------test---------" > $out_log_path 2> $err_log_path
done > $out_log_path 2> $err_log_path
现在文件的回显工作正常,但由于某种原因,我得到了
$out\u log\u path:不明确的重定向
::如果我使用
done>“$out\u log\u path”2>“$err\u log\u path”

我找到的唯一答案是检查路径中是否有空格,但我的路径是:
/Users/user/tmp/test\u bash/out\u logs/out\u 02\u 05.log

我做错了什么?

试试这个:

#/bin/bash
mkdir-p./err_日志
mkdir-p./out\u日志
err_path=$(realpath./err_日志)
out\u path=$(realpath./out\u日志)
err_log_path=“${err_path}/err_$(日期+%d_Um”).log”
out\u log\u path=“${out\u path}/out\u$(日期+%d\um”).log”
虽然真实;
做
echo“从bash启动main”
>&2 echo“从bash启动main”
python3 main.py
echo“完成运行主睡眠”
睡眠10
echo“剩余python进程列表:”
ps-ax | grep python
echo“关闭所有剩余进程”
ps ax | grep“python”| grep-v grep | awk{print$1}| xargs kill;
回显“完成关闭子流程”
#echo“-----测试----------“>$out\u log\u路径2>$err\u log\u路径
完成>$out\u log\u路径2>$err\u log\u路径
或者,如果代码必须在几天内运行,则:

#/bin/bash
虽然真实;
做
mkdir-p./err_日志
mkdir-p./out\u日志
err_path=$(realpath./err_日志)
out\u path=$(realpath./out\u日志)
err_log_path=“${err_path}/err_$(日期+%d_Um”).log”
out\u log\u path=“${out\u path}/out\u$(日期+%d\um”).log”
echo“从bash启动main”>>$out\u log\u路径2>>$err\u log\u路径
>&2 echo“从bash启动main”
python3 main.py>>$out\u log\u path 2>>$err\u log\u path
echo“已完成运行主睡眠”>>$out\u log\u路径2>>$err\u log\u路径
睡眠10
echo“剩余python进程列表:”>>$out\u log\u path 2>>$err\u log\u path
ps-ax | grep python>>$out\u log\u path 2>>$err\u log\u path
回显“关闭所有剩余进程”。>>$out\u log\u路径2>>$err\u log\u路径
ps ax | grep“python”| grep-v grep | awk'{print$1}'| xargs kill>>$out_log_path 2>>>$err_log_path
echo“完成关闭子进程”>>$out\u log\u路径2>>$err\u log\u路径
echo“-----测试----------“>$out\u log\u路径2>>$err\u log\u路径
完成

但不建议使用第二个选项。

如果将
更改为
>
?其他问题是长管道集可能存在缓冲问题。在启动while循环时,您需要开始向文件
$out\u log\u path
$err\u log\u path
发送输出,但此时尚未定义这些变量。因此,最后一行(以
done
开头)将显示为shell的
done2>
,这可能会触发错误消息。一旦定义了变量,在循环内部就不会出现问题,并且
echo“-----test------
命令将其输出发送到正确的文件。顺便说一句,使用
pgrep
python比使用
ps | grep | grep | awk
更好;但是如果没有pgrep,您可以只使用
ps|awk
--
ps ax|awk'/python/&&/awk/{print$1}'
awk
完成所有工作,不需要任何
grep
s(比这更好的是使用真正的流程监控系统——这样可以识别特定服务的PID,而不是针对系统上的任何/每个Python流程;此外,一个好的流程监控程序将为您清理散乱的子流程,并在退出后重新启动主程序,如果您将其配置为这样做,那么首先,不需要自己编写任何逻辑;而且,使用操作系统的过程监控意味着日志管理/警报/etc工具将知道发生了什么)。这看起来像是希望
python3 main.py
只启动Python进程,但它并不是这样做的。该命令只有在Python脚本退出时才会完成。(当然,它可能反过来生成需要等待的后台子进程;但这是不寻常的。)回复:
&2 echo
,重定向在行首和行尾的工作方式相同,因此它会写入错误日志。@CharlesDuffy:好的,我会编辑我的代码并删除我的注释。第二个代码示例的效率比OP的原始代码低得多。放入
>“$out\u log\u path”2>“$err\u log\u path”
在整个循环中是首选的:它只打开文件一次,而不是每次写入时都重新打开它们,并在单个命令完成时关闭它们(稍后再重新打开),而且它还避免了需要仔细判断
>
是否适合每种情况(您有许多
>
将清空输出文件,从而清除上面几行所写的内容)@CharlesDuffy:Oops,你关于
>
而不是
>
的看法是对的。第二个选项显然效率不高,但我不明白OP为什么要计算循环内部的路径。也许他的代码必须运行几天。我不确定为什么运行几天会产生不同。担心是不是写操作被缓冲在内存中而不是立即写入?因为每个程序在退出之前都必须刷新自己的缓冲区,并且
echo
立即执行写操作,所以我认为这里没有任何风险…至少没有任何额外的风险;如果Python程序缓冲其写操作,并且每个单独的运行都会发生在很长一段时间内,无论哪种方式,问题的数量都是相同的(在两种情况下,缓冲都可能发生,直到单独的Python运行退出)。