用php启动一个猪脚本

时间:2013-12-23 13:28:59

标签: php bash shell apache-pig

我正在学习Pig Latin,我想知道如何用PHP启动一个猪脚本。

这是我启动脚本的行:

pig -f ../testjava/calculs_routage.pig -param input=/user/hive/warehouse/tableRoutage/ -param output=/resultatsRequetes/obj1/resultatObj1 -param date1=2013-11-08T00:00:00.000Z -param date2=2013-11-15T00:00:00.000Z

我有一个可以在我的shell中启动的脚本(我是root)并且它有效,我尝试用bash启动我的猪脚本,它也可以。

但是当我尝试使用我的php应用程序(所以我的用户是apache)时,它不起作用。我试图直接或用bash启动猪脚本但它失败了。这是我启动脚本的行:

$cmdTest = exec('pig -f ../testjava/calculs_routage.pig -param input=/user/hive/warehouse/tableRoutage/ -param output=/resultatsRequetes/obj1/resultatObj1 -param date1=2013-11-08T00:00:00.000Z -param date2=2013-11-15T00:00:00.000Z 2>&1');

我尝试用sudo更改用户,但也失败了。

bash脚本:

#!/bin/bash
sudo -s -u root

pig -f ../testjava/calculs_routage.pig -param input=/user/hive/warehouse/tableRoutage/ -param output=/resultatsRequetes/obj1/resultatObj1 -param date1=2013-11-08T00:00:00.000Z -param date2=2013-11-15T00:00:00.000Z

我不知道问题在哪里,是用户还是日志文件的错误?我试图在log4j属性中更改日志文件的路径,但它不会改变任何内容。

我的错误消息:

 sudo: sorry, you must have a tty to run sudo 
13/12/23 14:16:35 WARN pig.Main: Cannot write to log file: /var/www/html/phpmail/vue/pig_1387804595477.log 
2013-12-23 14:16:35,481 [main] INFO org.apache.pig.Main - Apache Pig version 0.11.1-Intel (r16951) compiled Jun 19 2013, 17:26:05 
2013-12-23 14:16:35,734 [main] INFO org.apache.pig.impl.util.Utils - Default bootup file /var/www/.pigbootup not found 
2013-12-23 14:16:35,752 [main] WARN org.apache.pig.Main - Cannot write to log file: /var/www/html/phpmail/vue//calculs_routage.pig1387804595751.log 
2013-12-23 14:16:35,767 [main] ERROR org.apache.pig.Main - ERROR 2999: Unexpected internal error. null 
2013-12-23 14:16:35,767 [main] WARN org.apache.pig.Main - There is no log file to write to. 
2013-12-23 14:16:35,767 [main] ERROR org.apache.pig.Main - java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:394) 
at java.util.Properties.setProperty(Properties.java:143) 
at org.apache.pig.Main.run(Main.java:454) at org.apache.pig.Main.main(Main.java:157) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.hadoop.util.RunJar.main(RunJar.java:187)

我不知道该怎么做,我需要这个非常高效的脚本。

感谢您阅读此内容并感谢您的帮助! 和节日快乐!!

的Angélique

2 个答案:

答案 0 :(得分:1)

错误消息非常明确 - 您不能在没有终端的shell脚本中使用sudo,因为它希望用户输入密码。

可能有助于使用SUID位或“expect”命令(http://linux.die.net/man/1/expect)来提供密码

答案 1 :(得分:1)

你真的不想以root身份运行这些东西。

您可以使用su -s /bin/bash apache来使用Apache。然后通过提供对日志等的正确访问来使您的脚本以apache用户身份运行。

(注意:你的apache用户可能是www-data或其他东西而不是apache,你可以使用ps aux | egrep '(apache|httpd)'来检查)