exitting withcl.exe exit status 21 怎么解决

更多公众号:inspur-SV浪潮服务器,中国服务器第一品牌,出货量中国第一,全球第五,18年蝉联国产服务器销量、销售额第一,11年蝉联政府行业市场份额第一,广泛应用于政府、教育、企业、金融、电信、科研、交通、制造等行业。最新文章相关推荐对这篇文章不满意?您可以继续搜索:百度:搜狗:感谢您阅读【818不败家】10分钟搭建Hadoop平台,让你玩转电商,本文可能来自网络,如果侵犯了您的相关权益,请联系管理员。QQ:1142人阅读
Hadoop(5)
Docker(8)
本文内容:使用docker配置hadoop单机伪分布式开发环境
本教程配置环境:
docker (virtual box / virtual machine或者直接用ubuntu14.04都ok!,建议还是用虚拟机,docker太难搞了,没有配置的官方文件)
ubuntu14.04(Ubuntu 12.04 /32位、64位都ok!)
hadoop 2.6.0 (原生 Hadoop 2都ok!)
jdk1.8.0_91(应该1.6+应该都ok!)blog
Docker安装和配置
#&apt-get update
#&apt-get install docker.io&
#service docker start
让它随服务器的启动而自动运行
#&update-rc.d docker defaults
#gpasswd -a pika docker &#普通用户pika也可以运行docker命令
Ubuntu配置
下载ubuntu镜像
#&docker pull ubuntu:14.04
#docker run -it ubuntu bash
创建hadoop用户
{虚拟机中 配置时可能要用到,docker中不用}
如果你安装 Ubuntu 的时候不是用的 “hadoop” 用户,那么需要增加一个名为 hadoop 的用户。
首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :sudo useradd -m hadoop -s /bin/bash
这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。
接着使用如下命令设置密码:sudo passwd hadoop
可为 hadoop 用户增加管理员权限,方便部署,避免一些权限问题:sudo adduser hadoop sudo
最后注销当前用户,在登陆界面使用刚创建的 hadoop 用户进行登陆
安装必要和常用软件
root@fa1d:/# apt-get update&& #更新apt,不是用的docker也是这样操作
# apt-get install -y vim
安装和配置java环境
在主机上从官方网站下载对应版本的JDK安装包
将本机下载目录/media/pika/softwares/Downloads/LinuxInstalls分享到Docker的/mnt 目录下
#docker run -v /media/pika/softwares/Downloads/LinuxInstalls:/mnt -it c917d6497f55 bash
root@f26f7d459863:/# tar -zxf /mnt/jdk-8u91-linux-x64.tar.gz -C /opt&& #解压到/opt目录
root@f26f7d459863:/#sudo vim /etc/environment
第一行“...”的path末尾加上:${JAVA_HOME}/bin,后面export路径
PATH=&/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:${JAVA_HOME}/bin&
export JAVA_HOME=/opt/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
root@f26f7d459863:/#
sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91/bin/java 300;
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_91/bin/javac 300;
sudo update-alternatives --install /usr/bin/javah javah /opt/jdk1.8.0_91/bin/javah 300;
sudo update-alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_91/bin/jar 300
. /etc/environment
测试是否安装成功
root@f26f7d459863:/#java -version
lz使用的ubuntu镜像是之前配置好的python_ubuntu[],里面安装好了vim、openssh-server等等,当然你可以直接安装
安装SSH、配置SSH无密码登陆
集群、单节点模式都需要用到 SSH 登陆(ssh must be installed and sshd must be running to use the Hadoop scripts that manage remote Hadoop daemons),Ubuntu 默认已安装了 SSH client,还需要安装 SSH server:
root@f26f7d459863:/#sudo apt-get install -y openssh-server
编辑sshd的配置文件root@f26f7d459863:/#vim /etc/ssh/sshd_config,将其中UsePAM参数设置成“no”
启动sshd服务root@f26f7d459863:/# /etc/init.d/ssh start&
#每次重启都要重新启动,所以要加入到profile中开机自启
# vim /etc/profile
查看ssh服务状态 root@f26f7d459863:/# ps -e | grep ssh
&& 47 ?&&&&&&& 00:00:00 sshd
安装后,可以使用如下命令登陆本机:ssh localhost
此时会有SSH首次登陆提示,输入 no,(输入yes再输入密码,这样就登陆到本机了,但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便,如果进去了首先退出刚才的 ssh)。
回到我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:
exit&&&&&&&&&&&&&&&&&&&&&&&&&& # 退出刚才的 ssh localhost
cd ~/.ssh/&&&&&&&&&&&&&&&&&&&& # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa&&&&&&&&&&&&& # 会有提示,都按回车就可以
cat ./id_rsa.pub && ./authorized_keys& # 加入授权
另开一个terminal,保存当前的容器为镜像
docker ps找到刚才安装了ssh的镜像/容器id
docker commit 容器id
pika:~$docker ps
CONTAINER ID&&&&&&& IMAGE&&&&&&&&&&&&&& COMMAND&&&&&&&&&&&& CREATED&&&&&&&&&&&& STATUS&&&&&&&&&&&&& PORTS&&&&&&&&&&&&&& NAMES
07f9a3b3f737&&&&&&& tmp:latest&&&&&&&&& &bash&&&&&&&&&&&&&& 5 minutes ago&&&&&& Up 5 minutes&&&&&&&&&&&&&&&&&&&&&&&&&&& condescending_pike& &
pika:~$docker commit o7f9 ssh
Hadoop的安装和配置
Hadoop 2 可以通过 http://mirror./apache/hadoop/common/ 或者 /apache/hadoop/common/ 下载,一般选择下载最新的稳定版本,即下载 “stable” 下的 hadoop-2.x.y.tar.gz 这个格式的文件,这是编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用。
安装Hadoop 至 /usr/local/ 中
docker容器中下载hadoop到/usr/local并解压
root@f851ff17e8ad:~# wget http://mirror./apache/hadoop/common/hadoop-2.6.4/hadoop-2.6.4.tar.gz -P /usr/local
root@f851ff17e8ad:/usr/local# tar -zxf hadoop-2.6.4.tar.gz
root@f851ff17e8ad:/usr/local# ln -s /usr/local/hadoop-2.6.4 /usr/local/hadoop&&& #设置软链接,这样两个目录是一样的了
# ls /usr/local/hadoop
LICENSE.txt& README.txt& etc&&&&& input& libexec& sbin&& tmp
NOTICE.txt&& bin&&&&&&&& include& lib&&& output&& share
sudo chown -R hadoop ./hadoop&&&&&& # -R递归修改文件所有者为hadoop
检查 Hadoop 是否可用
. /etc/environment& #先要执行这个,否则JAVA_HOMEF未设置,很奇怪,这个文件没有在docker run的时候随机启动,但是/etc/profile却又的确随机启动了?
root@f851ff17e8ad:/usr/local# hadoop/bin/hadoop version
Hadoop 2.6.4
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 0b0b7e115f9625ed7fac69f937e6
Compiled by jenkins on T09:45Z
Compiled with protoc 2.5.0
From source with checksum 8dee2286ecdbbbc930a6c87b65cbc010
This command was run using /usr/local/hadoop-2.6.4/share/hadoop/common/hadoop-common-2.6.4.jar
Hadoop单机非分布式配置
Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。
Hadoop单机非分布式实例运行
Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 'o*' 的单词并统计出现的次数,最后输出结果到 output 文件夹中。
root@f851ff17e8ad:/usr/local/hadoop# rm -r output
root@f851ff17e8ad:/usr/local/hadoop# mkdir input
root@f851ff17e8ad:/usr/local/hadoop# cp README.txt input/&&& # 将readme文件作为输入文件测试
root@f851ff17e8ad:/usr/local/hadoop# ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep ./input ./output 'o*'
root@f851ff17e8ad:/usr/local/hadoop# cat ./output/*
Note: Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除,所以每次运行hadoop最好在前面加上rm -r ./output
Hadoop单机伪分布式配置
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
Hadoop执行命令目录加入到path中
# vim /etc/environment
PATH=&/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin&
export JAVA_HOME=/opt/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${HADOOP_HOME}/share
export HADOOP_HOME=/usr/local/hadoop-2.6.4
Note: HADOOP_HOME必须使用实际目录,不能使用软链接!
# . /etc/environment
修改配置文件 core-site.xml和hdfs-site.xml
root@f851ff17e8ad:/usr/local/hadoop# vim etc/hadoop/core-site.xml
root@f851ff17e8ad:/usr/local/hadoop# vim etc/hadoop/hdfs-site.xml
将当中的&configuration&&/configuration&修改成:
&configuration&
&&&&&&& &property&
&&&&&&&&&&&& &name&hadoop.tmp.dir&/name&
&&&&&&&&&&&& &value&file:/usr/local/hadoop/tmp&/value&
&&&&&&&&&&&& &description&Abase for other temporary directories.&/description&
&&&&&&& &/property&
&&&&&&& &property&
&&&&&&&&&&&& &name&fs.defaultFS&/name&
&&&&&&&&&&&& &value&hdfs://localhost:9000&/value&
&&&&&&& &/property&
&/configuration&
同样修改配置文件 hdfs-site.xml:
&configuration&
&&&&&&& &property&
&&&&&&&&&&&& &name&dfs.replication&/name&
&&&&&&&&&&&& &value&1&/value&
&&&&&&& &/property&
&&&&&&& &property&
&&&&&&&&&&&& &name&dfs.namenode.name.dir&/name&
&&&&&&&&&&&& &value&file:/usr/local/hadoop/tmp/dfs/name&/value&
&&&&&&& &/property&
&&&&&&& &property&
&&&&&&&&&&&& &name&dfs.datanode.data.dir&/name&
&&&&&&&&&&&& &value&file:/usr/local/hadoop/tmp/dfs/data&/value&
&&&&&&& &/property&
&/configuration&
Hadoop配置文件说明
Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。
同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
配置完成后,执行 NameNode 的格式化
root@f851ff17e8ad:/usr/local/hadoop# bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
16/05/07 02:22:15 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted.
16/05/07 02:22:15 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid &= 0
16/05/07 02:22:15 INFO util.ExitUtil: Exiting with status 0
开启 NameNode 和 DataNode 守护进程
root@962af2807540:/# start-dfs.sh
Note: 若出现SSH提示,输入yes即可
启动Hadoop可能的错误及解决
Hadoop无法正常启动的解决方法
一般可以查看启动日志来排查原因,注意几点:
启动时会提示形如 “DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out”,其中 DBLab-XMU 对应你的机器名,但其实启动日志信息是记录在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以应该查看这个后缀为 .log 的文件;
每一次的启动日志都是追加在日志文件之后,所以得拉到最后面看,对比下记录的时间就知道了。
一般出错的提示在最后面,通常是写着 Fatal、Error、Warning 或者 Java Exception 的地方。
可以在网上搜索一下出错信息,看能否找到一些相关的解决方法。
启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。该 WARN 提示可以忽略,并不会影响正常使用(该 WARN 可以通过
编译 Hadoop 源码解决)。
出错:Starting namenodes on [localhost]
localhost: Error: JAVA_HOME is not set and could not be found.
明明已经设置了,并且root@962af2807540:/# echo $JAVA_HOME
/opt/jdk1.8.0_91成功输出!
终于找到解决方案:
root@962af2807540:/# vim /usr/local/hadoop-2.6.4/libexec/hadoop-config.sh
在这个位置加上export JAVA_HOME=/opt/jdk1.8.0_91
启动 Hadoop 时提示 Could not resolve hostname
如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况
这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。首先按键盘的 ctrl + c 中断启动,然后在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
执行 source ~/.bashrc 使变量设置生效,然后再次执行 ./sbin/start-dfs.sh 启动 Hadoop。
错误4:DataNode 没有启动
一般情况下,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要请不要这样做):
./sbin/stop-dfs.sh&& # 关闭
rm -r ./tmp 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format 重新格式化 NameNode
./sbin/start-dfs.sh& # 重启
通过jps查看启动的Hadoop进程
启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
root@962af2807540:/# jps
2364 NameNode
2477 DataNode
2623 SecondaryNameNode
Note: 如果是虚拟机配置的hadoop,成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
可以保存docker容器为images,下次不用再配置!
另开一个terminal:
pika:/usr/local$docker ps
CONTAINER ID&&&&&&& IMAGE&&&&&&&&&&&&&& COMMAND&&&&&&&&&&&& CREATED&&&&&&&&&&&& STATUS&&&&&&&&&&&&& PORTS&&&&&&&&&&&&&& NAMES
962af2807540&&&&&&& hadoop1:latest&&&&& &bash&&&&&&&&&&&&&& 49 minutes ago&&&&& Up 49 minutes&&&&&&&&&&&&&&&&&&&&&&&&&& elegant_ritchie&&& &
pika:/usr/local$docker commit 962afa75c4df75dc7c8834beb14a3ff hadoop2
ed64af5ef22bbe5786cbd3d0e443c906aa3c12b7a9528162adbb47
不知道为嘛,每次重新打开docker容器,一定要手动执行,配置文件死也不自动执行,也是醉了!!!
pika:~$docker run -it hadoop2 bash
root@962af2807540:/# . /etc/environment&&&&&& #lz每次都要执行一次,再检查一次,再执行一次才有效,什么鬼!
root@962af2807540:/# echo $PATH&& #检查
root@962af2807540:/# /etc/init.d/ssh start
Hadoop单机伪分布式运行实例
单机模式grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。这里我们还要自己写java代码,并在java代码中引入hadoop packages。
{浅色部分是在虚拟机中配置时可能要用的,docker中并不用}
要使用 HDFS,首先需要在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着将文件复制到分布式文件系统中。
我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input
#将宿主机上.../hw2目录下的文件(java文件,输入测试文件 )传入docker镜像hadoop2中
pika:~$docker run -v /media/pika/files/mine/java_workspace/BDMS/src/hw2:/mnt -it hadoop2 bash
root@86bad9431b71:/# mkdir /files
root@86bad9431b71:/# cp -r /mnt/* /files/
root@b4fa0b8f916a:/# ls /files/
AvgTime-manifest.txt& AvgTime.java& example-input.txt& part1-input
#设置环境变量/启动ssh
root@962af2807540:/# . /etc/environment&&&&&& #很神奇的问题:lz每次都要执行一次,检查一次,再执行一次,再检查才有效,什么鬼!
root@962af2807540:/# echo $PATH&& #检查
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/jdk1.8.0_91/bin:/usr/local/hadoop-2.6.4/bin:/usr/local/hadoop-2.6.4/sbin
root@962af2807540:/# hadoop classpath
Note:要将hadoop classpath输出加入到CLASSPATH中,Hadoop provides a convenient utility to get the CLASSPATH information you need. Run &hadoop classpath& This should give you the information you need set your classpath for compiling your code.否则java代码中import package
org.apache.hadoop.*会出错:javac .java error: package org.apache.hadoop.conf does not exist...[]
root@962af2807540:/# export CLASSPATH=$CLASSPATH:/usr/local/hadoop-2.6.4/etc/hadoop:/usr/local/hadoop-2.6.4/share/hadoop/common/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/common/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/hdfs/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/yarn/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-2.6.4/share/hadoop/mapreduce/*:/usr/local/hadoop-2.6.4/contrib/capacity-scheduler/*.jar
root@962af2807540:/# /etc/init.d/ssh start&&& #.bashrc和/etc/environment启动都不行!什么鬼!
#启动hadoop并将input文件copy到hdfs中
root@cbdb25c79414:/# start-dfs.sh
root@cbdb25c79414:/# hdfs dfs -ls /&&& #初始为空
root@cbdb25c79414:/# hdfs dfs -mkdir -p /pika/input
root@cbdb25c79414:/# hdfs dfs -ls /
Found 1 items
drwxr-xr-x&& - root supergroup&&&&&&&&& 0
07:46 /pika
root@4e43a145c914:/# hdfs dfs -put /files/*input* /pika/input&&& #将docker images中的输入文件copy到hadoop hdfs文件系统中供其使用(.java文件是可以不用copy进去的)
root@fc:/# hdfs dfs -ls /pika/input
Found 2 items
-rw-r--r--&& 1 root supergroup&&&&&&& 165
15:52 /pika/input/example-input.txt
drwxr-xr-x&& - root supergroup&&&&&&&&& 0
15:52 /pika/input/part1-input
#编译执行java的hadoop程序
root@b4fa0b8f916a:/# cd files
root@b4fa0b8f916a:/files# rm -f *.class *.jar&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #移除已有的java编译文件
root@b4fa0b8f916a:/files# javac AvgTime.java
root@b4fa0b8f916a:/files# jar cfm AvgTime.jar AvgTime-manifest.txt AvgTime*.class
root@b4fa0b8f916a:/files# hdfs dfs -rm -f -r /pika/output&&&&&&&&&&&&&&&& #移除已有的output文件夹目录
root@b4fa0b8f916a:/files#hadoop jar ./AvgTime.jar /pika/input/example-input.txt /pika/output&&&&&&&&&&& #执行hadoop程序
root@b4fa0b8f916a:/files#hdfs dfs -cat '/pika/output/part-*'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #查看输出
1.2.3.4 && &2 28.500
alpha 1.2.3.4&& &2 20.200
beta alpha&& &2 4.100
Note: Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:&& ./bin/hdfs
dfs -rm -r output
运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
Configuration conf = new Configuration();
Job job = new Job(conf);
/* 删除输出目录 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);
最后可以保存上面的操作为新的docker images:
pika:~$docker ps
CONTAINER ID&&&&&&& IMAGE&&&&&&&&&&&&&& COMMAND&&&&&&&&&&&& CREATED&&&&&&&&&&&& STATUS&&&&&&&&&&&&& PORTS&&&&&&&&&&&&&& NAMES
fc&&&&&&& hadoop3:latest&&&&& &bash&&&&&&&&&&&&&& 50 minutes ago&&&&& Up 50 minutes&&&&&&&&&&&&&&&&&&&&&&&&&& berserk_nobel&&&&& &
pika:~$docker commit f780 hadoop
ed780cf5e9d631e00bdb26eded5bfbd6bb
终于写完了,也是给跪了。。。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:827323次
积分:12538
积分:12538
排名:第759名
原创:467篇
转载:73篇
评论:98条
文章:21篇
阅读:53818
阅读:10318
文章:13篇
阅读:23385
阅读:13419
文章:16篇
阅读:41460
文章:18篇
阅读:28355
(4)(18)(24)(4)(6)(16)(6)(11)(15)(5)(4)(5)(30)(8)(12)(9)(10)(17)(20)(19)(7)(24)(9)(15)(19)(57)(12)(28)(15)(36)(15)(19)(2)(2)
Contact meExit and Exit StatusAdvanced Bash-Scripting Guide: PrevNextChapter 6. Exit and Exit Status&... there are dark corners in the Bourne shell, and people use all
of them.--Chet RameyThe
command terminates a script, just as in a C
program. It can also return a value, which is available to the
script's parent process.Every command returns an
exit status
(sometimes referred to as a
return status
or exit code).
A successful command returns a 0, while
an unsuccessful one returns a non-zero
value that usually can be interpreted as an error
code. Well-behaved UNIX commands, programs, and
utilities return a 0 exit code upon
successful completion, though there are some exceptions.Likewise, functions
within a script and the script itself return an exit
status. The last command executed in the function or
script determines the exit status. Within a script, an
command may be used to deliver an
exit status to the shell
must be an integer in the 0 -
255 range).When a script ends with an exit that has
no parameter, the exit status of the script is the exit status
of the last command executed in the script (previous to the
exit).#!/bin/bash
COMMAND_LAST
# Will exit with status of last command.
exitThe equivalent of a bare exit is
exit $? or even just omitting the
exit.#!/bin/bash
COMMAND_LAST
# Will exit with status of last command.
exit $?#!/bin/bash
COMMAND_LAST
# Will exit with status of last command.
$? reads the exit status of the last
command executed. After a function returns,
$? gives the exit status of the last
command executed in the function. This is Bash's way of giving
functions a "return value."
Following the execution of a pipe, a $?
gives the exit status of the last command executed.After a script terminates, a $? from the
command-line gives the exit status of the script, that is, the
last command executed in the script, which is, by convention,
0 on success or an integer in the
range 1 - 255 on error.Example 6-1. exit / exit status#!/bin/bash
echo hello
# Exit status 0 returned because command executed successfully.
# Unrecognized command.
# Non-zero exit status returned -- command failed to execute.
# Will return 113 to shell.
# To verify this, type "echo $?" after script terminates.
By convention, an 'exit 0' indicates success,
#+ while a non-zero exit value means an error or anomalous condition.
See the "Exit Codes With Special Meanings" appendix.$? is especially useful
for testing the result of a command in a script (see Example 16-35 and Example 16-20).The !, the logical
not qualifier, reverses the outcome of a test or
command, and this affects its exit
Example 6-2. Negating a condition using !true
# The "true" builtin.
echo "exit status of \"true\" = $?"
echo "exit status of \"! true\" = $?"
# Note that the "!" needs a space between it and the command.
leads to a "command not found" error
# The '!' operator prefixing a command invokes the Bash history mechanism.
# No error this time, but no negation either.
# It just repeats the previous command (true).
# =========================================================== #
# Preceding a _pipe_ with ! inverts the exit status returned.
ls | bogus_command
# bash: bogus_command: command not found
! ls | bogus_command
# bash: bogus_command: command not found
# Note that the ! does not change the execution of the pipe.
# Only the exit status changes.
# =========================================================== #
# Thanks, Stéphane Chazelas and Kristopher Newsome.
Certain exit status codes have reserved meanings and should not
be user-specified in a script. Notes[1]In those instances when there is no return
terminating the function.PrevHomeNextEscapingUpTests}

我要回帖

更多关于 exit status 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信