我正在学习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
答案 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)'
来检查)