Я пытаюсь запустить JDK самораспаковывающийся .bin файл через питона подпроцесса,Запуск JDK самораспаковывающийся .bin файл застрял с питона подпроцесса
Вот код
proc = subprocess.Popen('./jdk-6u45-linux-i586.bin', cwd=installdir,shell=True, stdout=subprocess.PIPE)
он работает и застрял, выход показ ниже:
Install jdk-6u45-linux-i586.bin ...
Unpacking...
файл бин способен работать независимо друг от друга в терминале
Включаю отладки оболочечной
proc = subprocess.Popen('sh -x ./jdk-6u45-linux-i586.bin', cwd=installdir,shell=True, stdout=subprocess.PIPE)
вывода, как показано ниже
Install jdk-6u45-linux-i586.bin ...
Unpacking...
+ PATH=/usr/bin:/bin
Checksumming...
+ umask 022
Extracting...
+ javahome=jdk1.6.0_45
UnZipSFX 5.50 of 17 February 2002, by Info-ZIP ([email protected]).
+ platform=linux
creating: jdk1.6.0_45/
+ PACKED_JARS='jre/lib/rt.jar jre/lib/jsse.jar jre/lib/charsets.jar lib/tools.jar jre/lib/ext/localedata.jar jre/lib/plugin.jar jre/lib/javaws.jar jre/lib/deploy.jar'
creating: jdk1.6.0_45/jre/
+ ARCH=32
creating: jdk1.6.0_45/jre/bin/
+ BINARY_NAME=jdk-6u45-fcs-bin-b06-linux-i586-26_mar_2013.bin
inflating: jdk1.6.0_45/jre/bin/java
+ diskSpaceRequired=230500
inflating: jdk1.6.0_45/jre/bin/keytool
++ uname -s
inflating: jdk1.6.0_45/jre/bin/policytool
+ '[' Linux = Linux ']'
inflating: jdk1.6.0_45/jre/bin/rmiregistry
+ tail_args=-n
inflating: jdk1.6.0_45/jre/bin/rmid
+ outname=install.sfx.5699
inflating: jdk1.6.0_45/jre/bin/tnameserv
++ df -k .
inflating: jdk1.6.0_45/jre/bin/orbd
++ awk '{if ($4 ~ /%/) { print $3 } else { print $4 } }'
inflating: jdk1.6.0_45/jre/bin/servertool
++ tail -n -1
inflating: jdk1.6.0_45/jre/bin/unpack200
+ diskSpace=540468
inflating: jdk1.6.0_45/jre/bin/pack200
+ '[' 540468 -lt 230500 ']'
inflating: jdk1.6.0_45/jre/bin/jcontrol
+ trap 'rm -f $outname; exit 1' HUP INT QUIT TERM
linking: jdk1.6.0_45/jre/bin/ControlPanel -> ./jcontrol
+ echo Unpacking...
inflating: jdk1.6.0_45/jre/bin/java_vm
+ tail -n +146 ./jdk-6u45-linux-i586.bin
inflating: jdk1.6.0_45/jre/bin/javaws
+ '[' -x /usr/bin/sum ']'
creating: jdk1.6.0_45/jre/lib/
+ echo Checksumming...
creating: jdk1.6.0_45/jre/lib/applet/
++ /usr/bin/sum install.sfx.5699
creating: jdk1.6.0_45/jre/lib/ext/
+ sum='01464 70113'
inflating: jdk1.6.0_45/jre/lib/ext/sunjce_provider.jar
+ index=1
inflating: jdk1.6.0_45/jre/lib/ext/sunpkcs11.jar
+ for s in '$sum'
inflating: jdk1.6.0_45/jre/lib/ext/dnsns.jar
+ case $index in
inflating: jdk1.6.0_45/jre/lib/ext/localedata.pack
+ sum1=01464
inflating: jdk1.6.0_45/jre/lib/ext/meta-index
+ index=2
creating: jdk1.6.0_45/jre/lib/i386/
+ for s in '$sum'
creating: jdk1.6.0_45/jre/lib/i386/native_threads/
+ case $index in
inflating: jdk1.6.0_45/jre/lib/i386/native_threads/libhpi.so
+ sum2=70113
creating: jdk1.6.0_45/jre/lib/i386/server/
+ index=3
inflating: jdk1.6.0_45/jre/lib/i386/server/libjvm.so
+ '[' 01464 -ne 01464 ']'
inflating: jdk1.6.0_45/jre/lib/i386/server/Xusage.txt
+ '[' 70113 -ne 70113 ']'
linking: jdk1.6.0_45/jre/lib/i386/server/libjsig.so -> ../libjsig.so
+ chmod +x install.sfx.5699
inflating: jdk1.6.0_45/jre/lib/i386/libsaproc.so
+ echo Extracting...
creating: jdk1.6.0_45/jre/lib/i386/client/
+ ./install.sfx.5699
inflating: jdk1.6.0_45/jre/lib/i386/client/libjvm.so
Я также захватить саморазархивирован сценарий бен файл по
head -145 jdk-6u45-linux-i586.bin
Из сценария и отладки журнала, Я вижу, что это просто застряло в строке 74 сценария извлечения
echo "Extracting..."
./$outname
полный сценарий, как показано ниже:
#!/bin/sh
PATH=/usr/bin:/bin
umask 022
release_comp() {
if [ "$1" = "$2" ] ; then
echo "eq"
else
lrel=`printf "%s\n%s\n" $1 $2 | \
sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n | \
head -1`
if [ "$1" = "${lrel}" ]; then
echo "lt"
else
echo "gt"
fi
fi
}
install_JavaDB() {
return 0
}
javahome=jdk1.6.0_45
platform=linux
PACKED_JARS="jre/lib/rt.jar jre/lib/jsse.jar jre/lib/charsets.jar lib/tools.jar jre/lib/ext/localedata.jar jre/lib/plugin.jar jre/lib/javaws.jar jre/lib/deploy.jar"
ARCH=32
BINARY_NAME=jdk-6u45-fcs-bin-b06-linux-i586-26_mar_2013.bin
diskSpaceRequired=230500
if [ "`uname -s`" = "Linux" ]; then
tail_args="-n"
fi
outname=install.sfx.$$
diskSpace=`df -k . | tail ${tail_args} -1 | awk '{if ($4 ~ /%/) { print $3 } else { print $4 } }'`
if [ $diskSpace -lt $diskSpaceRequired ]; then
printf "You will need atleast %s kBytes of Disk Free\n" $diskSpaceRequired
printf "Please free up the required Disk Space and try again\n"
exit 3
fi
trap 'rm -f $outname; exit 1' HUP INT QUIT TERM
echo "Unpacking..."
tail ${tail_args} +146 "$0" > $outname
if [ -x /usr/bin/sum ]; then
echo "Checksumming..."
sum=`/usr/bin/sum $outname`
index=1
for s in $sum; do
case $index in
1)
sum1=$s;
index=2;
;;
2)
sum2=$s;
index=3;
;;
esac
done
if [ $sum1 -ne 01464 ] || [ $sum2 -ne 70113 ]; then
echo "The download file appears to be corrupted. Please refer"
echo "to the Troubleshooting section of the Installation"
echo "Instructions on the download page for more information."
echo "Please do not attempt to install this archive file."
exit 1
fi
else
echo "Can't find /usr/bin/sum to do checksum. Continuing anyway."
fi
chmod +x $outname
echo "Extracting..."
./$outname
rm -f $outname #we dont need it anymore, so conserve disk space
if [ -z "${RPM_NAME}" ]; then
if [ ! -d ${javahome} ]; then
echo "Failed to extract the files. Please refer to the Troubleshooting section of"
echo "the Installation Instructions on the download page for more information."
exit 1
fi
UNPACK_EXE=$javahome/bin/unpack200
if [ -f $UNPACK_EXE ]; then
chmod +x $UNPACK_EXE
packerror=""
for i in $PACKED_JARS; do
if [ -f $javahome/`dirname $i`/`basename $i .jar`.pack ]; then
printf "Creating %s\n" $javahome/$i
$UNPACK_EXE $javahome/`dirname $i`/`basename $i .jar`.pack $javahome/$i
if [ $? -ne 0 ] || [ ! -f $javahome/$i ]; then
printf "ERROR: Failed to unpack JAR file:\n\n\t%s\n\n" $i
printf "Installation failed. Please refer to the Troubleshooting Section of\n"
printf "the Installation Instructions on the download page.\n"
packerror="1"
break
fi
# remove the old pack file
rm -f $javahome/`dirname $i`/`basename $i .jar`.pack
fi
done
if [ "$packerror" = "1" ]; then
if [ -d $javahome ]; then
/bin/rm -rf $javahome
fi
exit 2
fi
fi
PREFS_LOCATION="`echo \"${javahome}\" | sed -e 's/^jdk.*/&\/jre/'`/.systemPrefs"
if [ ! -d "${PREFS_LOCATION}" ]; then
mkdir -m 755 "${PREFS_LOCATION}"
fi
if [ ! -f "${PREFS_LOCATION}/.system.lock" ]; then
touch "${PREFS_LOCATION}/.system.lock"
chmod 644 "${PREFS_LOCATION}/.system.lock"
fi
if [ ! -f "${PREFS_LOCATION}/.systemRootModFile" ]; then
touch "${PREFS_LOCATION}/.systemRootModFile"
chmod 644 "${PREFS_LOCATION}/.systemRootModFile"
fi
if [ x$ARCH = "x32" ] && [ -f "$javahome/bin/java" ]; then
"$javahome/bin/java" -client -Xshare:dump > /dev/null 2>&1
fi
else
if [ "$1" = "-x" ]; then
echo "Extraction of RPM Done."
else
# If rpm and the file exists then use rpm to install.
if [ -f `pwd`/$RPM_NAME ]; then
rpm -ivh `pwd`/$RPM_NAME
fi
install_JavaDB
fi
fi
echo " "
echo "Done."
exit 0
Любая идея о проблеме выше, я думаю, некоторые среды не переходят в питона, не мог понять, что это такое. как бункер может работать напрямую, а не через питон подпроцесс
Также я попытался использовать абсолютный путь вместо относительного пути по имени файла, то же самое. – yikaus
Просто попробовал удалить shell-True, передать команду как список, все равно. :( – yikaus
Пожалуйста, добавьте код, который вы делаете с объектом Popen. Используете ли вы stdout-pipe в своем коде на python? Подпроцесс будет блокироваться, если он заполнен. –