1. 什么是 java.awt.headless?
Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。
2. 何时使用和headless mode?
Headless模式虽然不是我们愿意见到的,但事实上我们却常常需要在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主机)。
3. 如何使用和Headless mode?
一般是在程序开始激活headless模式,告诉程序,现在你要工作在Headless mode下,就不要指望硬件帮忙了,你得自力更生,依靠系统的计算能力模拟出这些特性来:
System.setProperty("java.awt.headless", "true");
在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的。因为他返回当前路径的"."。
这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行程序的相对位置(绝对位置除外)。
在/home/admin/test/下新建admin.sh内容如下:
- cd `dirname $0`
- echo `pwd`
- sh test/admin.sh
- /home/admin/test
Linux 系统中,“!” 符号或者操作符通常被用做逻辑否定的操作符,同时也通过一些调整和改动命令来从历史记录中找出你需要的命令行。下面演示的命令行在bash Shell中都已经明确检查过可用了。不过我没有在其他的 Shell 解释器下测试过,不过我相信这些命令也不会在其他的解释器下运行。history
! -1 倒数第一条 !-2倒数第二条
如果系统中开启了IPV6协议(比如window7),java网络编程经常会获取到IPv6的地址,这明显不是我们想要的结果,搜索发现很多蹩脚的做法是:禁止IPv6协议。其实查看官方文档有详细的说明:
在实际的运用中有以下几种办法可以实现指定获取IPv4的地址:在java启动命令中增加一个属性配置:-Djava.net.preferIPv4Stack=true
echo $JAVA_HOME获取java环境变量
JVM参数设置请参考
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
启动spark脚本 ./main.sh xxx.xxx
#!/bin/bash
cd `dirname $0` 参考如上说明
BIN_DIR=`pwd` 获取当前路径
echo $BIN_DIR 输出当前路径
cd .. 回退到上一级目录
DEPLOY_DIR=`pwd` 然后获取路径
CONF_DIR=$DEPLOY_DIR/conf/META-INF/conf 组装配置文件路径
CONF_DIR_CONFIG=$CONF_DIR/config.properties 组装配置文件绝对路径
echo "CONF_DIR=$CONF_DIR" 输出路径
SPARK_CLASS=$1 获取启动时 xxx.xxx参数,$0获取./main.sh
echo "SPARK_CLASS=$SPARK_CLASS"
#SPARK_CLASS=`sed '/spark.class/!d;s/.*=//' $CONF_DIR_CONFIG | tr -d '\r'`
SPARK_MASTER=`sed '/spark.master/!d;s/.*=//' $CONF_DIR_CONFIG | tr -d '\r'` 获取配置文件中spark.class的值
SPARK_EXECUTOR_MEMORY=`sed '/spark.executor.memory/!d;s/.*=//' $CONF_DIR_CONFIG | tr -d '\r'` 获取配置文件中spark.executor.memory的值
SPARK_EXECUTOR_CORES=`sed '/spark.executor.cores/!d;s/.*=//' $CONF_DIR_CONFIG | tr -d '\r'`
JOB_SHOWSTDOUT=`sed '/job.showstdout/!d;s/.*=//' $CONF_DIR_CONFIG | tr -d '\r'`
if [ ! -n "$SPARK_MASTER" ]; then 如果SPARK_MASTER为空则退出
echo "ERROR: SPARK_MASTER is empty"
exit 1
fi
LOGS_DIR=""
LOGS_DIR=$DEPLOY_DIR/logs 获取日志目录
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR 不存在则创建日志目录
fi
STDOUT_FILE=$LOGS_DIR/stdout.log
echo "SPARK_MASTER=$SPARK_MASTER"
LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"` 循环遍历所有的jar,拼接如下x/xx/x.jar:/x/xx/y.jar
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
if [ "$1" = "debug" ]; then 判断是否为debug模式
JAVA_DEBUG_OPTS=" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n "
fi
JAVA_JMX_OPTS=""
if [ "$1" = "jmx" ]; then 判断是否为debug模式
JAVA_JMX_OPTS=" -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false "
fi
JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit` 判断是否为64位
if [ -n "$BITS" ]; then
JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
JAVA_MEM_OPTS=" -server -Xms1gm -Xmx1g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi
JOB_SHOW_TRUE="true"
echo -e "Starting the job ..."
if [ ! -n "$SPARK_CLASS" ]; then
echo "Params is empty, need all or spark class \c"
exit 1
fi
JAVA_JRE_LIB="$LIB_DIR/sunec.jar"
if [ ! -f "$JAVA_JRE_LIB" ]; then
echo "Cope Jre jar"
cp $JAVA_HOME/jre/lib/ext/*.jar $LIB_DIR
fi
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR -Djava.ext.dirs=$LIB_DIR $SPARK_CLASS $CONF_DIR_CONFIG $LIB_DIR > $STDOUT_FILE 2>&1 &
echo "OK!"