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

2024-10-02 10:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我是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

^{pr2}$

…开始如下:

python start_jboss_service.py jbstd-rss-D04

Tags: 脚本sslhomenetserverexportshelljboss
1条回答
网友
1楼 · 发布于 2024-10-02 10:27:57

问题一:阻塞子进程输出

您将输出重定向到一个管道,但实际上您永远不会使用该管道中的内容。即使nohup在启动后将重定向到/dev/null,但在该点之前尝试写入的任何内容都将在被消耗的缓冲区上被阻止,从而阻止脚本中在之后尝试写入的任何内容。在

您有两种选择:

  • 删除stdout=subprocess.PIPE,让脚本直接写入Python进程的原始stdout。在
  • 调用您构造的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()行,而不是解析参数列表。在

如果接受多个参数,则应将每个实例名称作为单独的参数传递,此时根本不需要使用逗号分隔:

^{pr2}$

相关问题 更多 >

    热门问题