通过python脚本使用nohup命令执行shell脚本

时间:2017-07-29 04:36:39

标签: python shell nohup

您好我是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

1 个答案:

答案 0 :(得分:0)

问题一:阻止子进程输出

您正在将输出重定向到管道,但是您实际上从未实际从该管道中消费内容。即使nohup在启动后会重定向到/dev/null,但在该点之前尝试写入的任何内容都将在正在使用的缓冲区上被阻止,从而阻止了之后中的任何内容尝试写作。

您有两种选择:

  • 删除stdout=subprocess.PIPE,让您的脚本直接写入Python进程的原始标准输出。
  • 在您构建的communicate()对象上调用Popen

采用前一种方法,你的命令可能只会变成:

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)])