簡體   English   中英

通過python腳本使用nohup命令執行shell腳本

[英]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-D04sys.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM