[英]executing shell script with nohup commands via python scripts
嗨,我是Python腳本的新手。 我正在嘗試通過python執行jboss啟動shell腳本。 shell腳本在直接執行時可以正常工作,但是在嘗試通過python執行時,效果不佳。 我在這里附加了我的shell腳本以及python腳本。 請幫我。
首先,運行shell腳本start_jboss.sh
:
#export JAVA_HOME=/opt/appserver/jdk1.7.0_79/
export INSTANCE=jbstd-rss-D04
export JBOSS_HOME=/opt/appserver/JBOSS/jboss-eap-6.4/
export CONF_HOME=/opt/appserver/JBOSS/jbstd-rss-D04/standalone/
export LOGFILEPATH=/opt/logs/jboss/${INSTANCE}
export JAVA_OPTS="$JAVA_OPTS -XX:MaxPermSize=512m -Xverify:none -
Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -
Dsun.rmi.dgc.server.gcInterval=3600000 -server -XX:+DoEscapeAnalysis -
XX:+UseCompressedOops -XX:+UseParallelGC -XX:+UseParallelOldGC -Xms1024M -
Xmx1024M -verbose:gc -Xloggc:/opt/logs/jboss/${INSTANCE}/gc.log -
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -
XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=20M"
nohup sh ${JBOSS_HOME}/bin/standalone.sh -
Djboss.server.base.dir=${CONF_HOME} -
Djboss.server.config.dir=$CONF_HOME/configuration/ -c standalone-full-ha.xml
-Djboss.node.name=jbstd-rss-D01
Djavax.net.ssl.trustStore=/opt/appserver/JBOSS/SSL/truststores/truststore.jks -Djavax.net.ssl.trustStorePassword=Was6user1 -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.keyStore=/opt/appserver/JBOSS/SSL/keystores/keystore.jks -Djavax.net.ssl.keyStorePassword=Was6user1 -Djboss.server.log.dir=${LOGFILEPATH} -DlogFilePath=${LOGFILEPATH} -Dorg.jboss.as.logging.per-deployment=false -Djboss.socket.binding.port-offset=300 -DRSS_HOME=/opt/appserver/rss >> /dev/null &
其次,Python包裝器start_jboss_service.py
:
#!/bin/python
import sys
import os
import subprocess
#get the instance names to start instances
input=str(sys.stdin.read())
instances=input.split(',')
numberOfInstances=len(instances)
jboss_home="/opt/appserver/JBOSS/"
if (numberOfiInstances > 0):
for i in (0,numberOfInstances):
cmd="%s%s/start_jboss.sh"%(jboss_home,instances[i])
subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
...開始如下:
python start_jboss_service.py jbstd-rss-D04
您將輸出重定向到管道,但實際上您從未真正使用過該管道中的內容。 即使nohup
在啟動后將重定向到/dev/null
,但在此點之前嘗試寫入的任何內容都將在消耗的緩沖區上被阻止,從而防止了嘗試寫入之后腳本中的任何內容。
您有兩種選擇:
stdout=subprocess.PIPE
,讓您的腳本直接寫入Python進程的原始stdout。 Popen
對象上調用communicate()
。 采用前一種方法,您的命令可能會變成:
for instance in string.split(input, ','):
if not instance: continue # ignore trailing or doubled-up commas
subprocess.Popen(['%s%s/start_jboss.sh' % (jboss_home, instance)])
如果運行python start_jboss_service.py jbstd-rss-D04
, sys.stdin.read()
不會返回jbstd-rss-D04
:這不會在標准輸入中傳遞,而是在參數列表中傳遞。
因此,您需要刪除sys.stdin.read()
,而是解析參數列表。
而且,如果您接受多個參數,則應將每個實例名稱作為一個單獨的參數傳遞-此時,您根本不需要分割逗號:
for instance in sys.argv[1:]:
subprocess.Popen(['%s%s/start_jboss.sh' % (jboss_home, instance)])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.