从php或python调用Bash脚本时挂起

2024-05-15 20:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是bash的新手,我编写了一个bash脚本,它从头到尾读取一个大的syslog文件,查找属于某一分钟(最后一分钟前一分钟)的条目,然后计算每一个给定模式在这一分钟内发生的次数。 如果从PHP/Python运行,它不起作用,但是如果我直接这样调用它,它就可以工作了:

sh /path/to/logparser.sh /path/to/big.log '2013-09-23T08:38' '2013-09-23T08:37' 'MySQL has gone away' 'Unhandled Error timed out'

以下是logparser.sh的代码:

logfile=$1
echo $logfile
shift
minute=$1
echo $minute
shift
minute_before=$1
echo $minute_before
shift
command="tac $logfile | sed -n -e '/$minute/p' -e '/$minute_before/q'"
echo $command
if [ -f $logfile ]; then
    buffer=$(eval $command)
    echo "buffer complete"
    exit 1
fi

旁注:

  • 我使用buffer=$(eval $command),因为buffer=$(tac $logfile | sed -n -e '/$minute/p' -e '/$minute_before/q')甚至挂在命令行中
  • 我在sed中使用了-e '/$minute_before/q',因为我不能得到'-e'/$minute/!去工作吧

但是当我通过pasthru()从PHP或从Python通过subprocess.Popen().communicate()运行它时,它会挂起。如果我用ps -ef r检查进程,就会发现tac仍在运行。在

下面是调用bash脚本的PHP代码:

^{pr2}$

下面是调用bash脚本的Python代码:

env           = sys.argv[1]
service_name  = sys.argv[2]
logfile       = sys.argv[3]
minute        = sys.argv[4]
minute_before = sys.argv[5]

args = ['sh', '%s/logparser.sh' % os.getcwd()]

for i in range(3, len(sys.argv)):
    args.append(sys.argv[i])

print args
output = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()
print output

我排除了其他的事情:

  • exec权限:PHP和Python都可以运行并获得linux命令的结果,比如whoami
  • 文件权限:对于更简单的bash脚本,PHP和Python都能很好地运行,例如,包含dateliunx命令的文件;日志文件对所有人都有读取权限
  • 错误的参数:我在bash脚本中比较了PHP/Python发送的参数和通过命令行发送的参数,它们是相同的

如何从PHP/Python调用它?在


Tags: 文件echo脚本bashbuffershsysargs
1条回答
网友
1楼 · 发布于 2024-05-15 20:41:47

似乎没有任何代码将日志文件传递给shell脚本,而是在shell中未设置logfile变量,使tac wait从stdin输入。在

就像在python代码中一样,您可能需要这样做:

for i in range(1, len(sys.argv)):
    args.append(sys.argv[i])

同样,在php代码中:

^{pr2}$

日志文件的路径没有传递给shell脚本的实际原因可能不同,但通常这是脚本挂起的基本原因。在

相关问题 更多 >