通过 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
,任何试图在该点之前写入的内容都将被阻塞在正在消耗的缓冲区上,从而阻止脚本 after[= 中的任何内容44=] 尝试写入。
您有两个选择:
- 删除
stdout=subprocess.PIPE
,让您的脚本直接写入 Python 进程的原始标准输出。
- 在您构建的
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()
不 return jbstd-rss-D04
: 这个不通过在标准输入上,但在参数列表上。
因此,您需要删除行 sys.stdin.read()
,而是解析参数列表。
如果您接受多个参数,您应该将每个实例名称作为一个单独的参数传递——此时您根本不需要用逗号分隔:
for instance in sys.argv[1:]:
subprocess.Popen(['%s%s/start_jboss.sh' % (jboss_home, instance)])
大家好,我是 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
,任何试图在该点之前写入的内容都将被阻塞在正在消耗的缓冲区上,从而阻止脚本 after[= 中的任何内容44=] 尝试写入。
您有两个选择:
- 删除
stdout=subprocess.PIPE
,让您的脚本直接写入 Python 进程的原始标准输出。 - 在您构建的
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()
不 return jbstd-rss-D04
: 这个不通过在标准输入上,但在参数列表上。
因此,您需要删除行 sys.stdin.read()
,而是解析参数列表。
如果您接受多个参数,您应该将每个实例名称作为一个单独的参数传递——此时您根本不需要用逗号分隔:
for instance in sys.argv[1:]:
subprocess.Popen(['%s%s/start_jboss.sh' % (jboss_home, instance)])