首页 文章 精选 留言 我的

精选列表

搜索[Bot管理],共10000篇文章
优秀的个人博客,低调大师

Linux常用命令—权限管理命令

1、chmod[changethepermissionsmodeofafile]:/bin/chmod 语法: chmod[{ugo}{+-=}{rwx}][文件或目录名]//直观 e.g. chmodu+wxfilename 所有者 chmodg=rwxfilename 所属组 chmodo-xfilename 其他人 eg: chmod g+w,o-r filename [root@localhosttmp]#ls-lstudy.list -rw-r--r--.1rootroot0May918:56study.list [root@localhosttmp]#chmodu+xstudy.list [root@localhosttmp]#ls-lstudy.list -rwxr--r--.1rootroot0May918:56study.list [root@localhosttmp]# 或者: chmod[mode=421][文件或目录] //推荐 权限所对数字: r-4 w-2 x-1 e.g. rwxr-xr-- 754 rw-r-x--x 651 rwxr-x-w-752 chmod777 filename //设定文件为所有用户具有全部权限 [root@localhosttmp]#chmod777study.list [root@localhosttmp]#ls-lstudy.list -rwxrwxrwx.1rootroot0May918:56study.list [root@localhosttmp]# -R 递归修改 chmod -R 777 testdir // 修改目录testdir及其目录下文件为所有文件具有全部权限 附:useradd 名字 //添加用户 su username //可切换用户 退出: exit 总结: 2、chown[changefileownership] /bin/chown chown[用户][文件名或目录名] //改变文件所有者,root才能做,前提是用户存在 e.g. chownnobodyfile1 #改变文件file1的所有者为nobody,nobody为系统默认存在的用户。 附-添加用户: 1)useraddafang 2)passwd afang #为其设置密码 3、chgrp[changefilegroupownership] /bin/chgrp chgrp[用户组][文件或目录] #改变文件或目录的所属组 #必须为系统已经存在的组 E.g. chgrpadmfile1 #改变文件file1的所属组为adm #其中adm是系统中已经有的一个组。 附:groupadd 组名 //添加组 4、umask /bin/umask //显示、设置文件的缺省权限 umask[-S] //-S以rwx形式显示新建文件或目录缺省权限,更直观一些 e.g. umask //查看默认权限,比较传统 #显示0022:0-特殊权限位,022-用户权限位--- -w- -w- 那么缺省文件或目录权限怎么计算: 首先在linux在默认创建的文件没有可执行权限,即没有x 计算: 777-022 = 755 //这是创建目录的默认权限 666-022 = 644 //是创建文件的默认权限,都没有x,文件权限都比目录权限少一个X 附1:很多UNIX系统中并没有-S这个选项,所以只能按照上面计算! 附2-Linux权限规则:默认创建的文件,不能授予可执行权限(X)!好处是屏蔽了很多攻击与病毒。 附3-改变缺省权限值:umask[掩码值]注意umask的值可以更改,但不推荐

优秀的个人博客,低调大师

关于supervisor管理docker容器遇到的坑

场景:可能有很多人对docker不熟悉的人经常遇到容器中启动服务提示不允许,如下图所示systemctl start sshdFailed to get D-Bus connection: Operation not permitted网上很多人说是centos7.0的bug,升级到7.2能解决,也有很多人说用其它的方法解决,我试过升级到7.2这个肯定是不行的,另外一种方法是启动容器的时候用/usr/sbin/init参数(方法确实可行),但是改变了容器启动后的参数,而且可能很多人和我一样对于dockerfile中的CMD和ENTRYPOINT的区别还不是很懂,所以我还是建议大家使用supervisor来启动一些服务,这不我昨天启动sshd和httpd服务就遇到两个坑。特此记录一下!目标:学习supervisor来启动容器中的sshd和httpd服务首先看一下一个Dockerfile文件,这也是网上大部分的解决方案再看一下supervisord.conf文件内容然后再builddocker build -t centos:v1 .最后启动容器docker run -d -it --name=zzz -p 2222:22 -p 80:80 centos:v1结果是很悲催的,容器启动不起来......经过各种调试和修改,Dockerfile文件如下和上面的Dockerfile有点不一样,主要有两点1、CMD启动参数,注意一定要用引号和逗号隔开2、加了ssh相关的一些key,sshd服务需求这些相关的文件,不然容器能启动,sshd服务启动不了删除之前的容器和镜像,然后重新build再启动最后进入容器测试:docker exec -it zzz bashsshd和httpd服务随新的容器创建或者老的容器重启都正常启动

优秀的个人博客,低调大师

ELK日志集中化管理系统安装

ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故有此简称。 ELK Stack 在最近两年迅速崛起,成为机器数据分析,或者说实时日志处理领域,开源界的第一选择。 ELK由三个组建构成,分别是 Elasticsearch,负责数据的索引和存储 Logstash ,负责日志的采集和格式化 Kibana,负责前端统计的展示 大致的架构如下: redis提供队列来作为broker负责log传输过程中的缓冲,也可以由kafka等来代替。 一、logstansh安装 1、JDK安装 1 2 3 4 5 yum-y install java-1.8.0 [root@ELKServer~] #java-version openjdkversion "1.8.0_101" OpenJDKRuntimeEnvironment(build1.8.0_101-b13) OpenJDK64-BitServerVM(build25.101-b13,mixedmode) 2、logstansh安装 1 2 3 4 5 wgethttps: //download .elastic.co /logstash/logstash/logstash-2 .3.4.zip unziplogstash-2.3.4.zip mv logstash-2.3.4 /usr/local/ echo "PATH=$PATH:/usr/local/logstash-2.3.4/bin" >> /etc/profile source /etc/profile 3、新建logstansh配置文件目录 1 mkdir /usr/local/logstash-2 .3.4 /conf 4、测试logstansh 1 2 3 4 5 [root@ELKServerlogstash-2.3.4] #logstash-e"input{stdin{}}output{stdout{}}" hello Settings:Defaultpipelineworkers:1 Pipelinemainstarted 2016-07-28T12:47:41.597Z0.0.0.0hello 二、redis安装 1、redis安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 wgethttp: //download .redis.io /releases/redis-2 .8.20. tar .gz yum install tcl-y tar -zxvfredis-2.8.20. tar .gz mv redis-2.8.20/ /usr/local/ [root@ELKServerlogstash-2.3.4] #cd/usr/local/redis-2.8.20/ [root@ELKServerredis-2.8.20] #makeMALLOC=libc [root@ELKServerredis-2.8.20] #makeinstall [root@ELKServerredis-2.8.20] #cdutils/ [root@ELKServerutils] #./install_server.sh#所有选项默认 Welcometotheredisserviceinstaller Thisscriptwillhelpyoueasily set uparunningredisserver Please select theredisport for thisinstance:[6379] Selectingdefault:6379 Please select theredisconfig file name[ /etc/redis/6379 .conf] Selecteddefault- /etc/redis/6379 .conf Please select theredislog file name[ /var/log/redis_6379 .log] Selecteddefault- /var/log/redis_6379 .log Please select thedatadirectory for thisinstance[ /var/lib/redis/6379 ] Selecteddefault- /var/lib/redis/6379 Please select theredisexecutablepath[ /usr/local/bin/redis-server ] Selectedconfig: Port:6379 Config file : /etc/redis/6379 .conf Log file : /var/log/redis_6379 .log Data dir : /var/lib/redis/6379 Executable: /usr/local/bin/redis-server CliExecutable: /usr/local/bin/redis-cli Isthisok?ThenpressENTERtogoonorCtrl-Ctoabort. Copied /tmp/6379 .conf=> /etc/init .d /redis_6379 Installingservice... Successfullyaddedtochkconfig! Successfullyaddedtorunlevels345! StartingRedisserver... Installationsuccessful! 2、查看redis的监控端口 1 2 3 [root@ELKServerutils] #netstat-tnlp|grepredis tcp000.0.0.0:63790.0.0.0:*LISTEN2085 /redis-server * tcp00:::6379:::*LISTEN2085 /redis-server * 3、测试redis是否缓存数据 a、新建logstansh配置文件如下: 1 2 3 4 5 6 7 8 9 10 [root@ELKServerconf] #catoutput_redis.conf input{stdin{}} #手动输入数据 output{ stdout{codec=>rubydebug} #页面debug信息 redis{ host=> '192.168.10.49' data_type=> 'list' key=> 'redis' } } b、启动logstansh 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@ELKServerconf] #logstash-foutput_redis.conf--verbose startingagent{:level=>:info} startingpipeline{: id => "main" ,:level=>:info} Settings:Defaultpipelineworkers:1 Startingpipeline{: id => "main" ,:pipeline_workers=>1,:batch_size=>125,:batch_delay=>5,:max_inflight=>125,:level=>:info} Pipelinemainstarted hello #手动输入 { "message" => "hello" , "@version" => "1" , "@timestamp" => "2016-07-28T13:09:42.651Z" , "host" => "0.0.0.0" } c、查看redis中是否存在数据。 1 cd /usr/local/redis-2 .8.20 /src/ 执行下面这条命令后再执行logstash -f output_redis.conf(最好分两个ssh会话测试)。 1 2 3 [root@ELKServersrc] #./redis-climonitor OK 1469711599.811344[0192.168.10.49:56179] "rpush" "redis" "{\"message\":\"hello\",\"@version\":\"1\",\"@timestamp\":\"2016-07-28T13:13:18.446Z\",\"host\":\"0.0.0.0\"}" 三、elasticsearch安装 1、elasticsearch安装配置 1 2 3 wgethttps: //download .elastic.co /elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2 .3.4 /elasticsearch-2 .3.4.zip unzipelasticsearch-2.3.4.zip mv elasticsearch-2.3.4 /usr/local/ 修改elasticsearch配置文件 1 vim /usr/local/elasticsearch-2 .3.4 /config/elasticsearch .yml 把下面参数的注释去掉并改成服务器IP。这里只做简单安装,优化及集群后面再介绍 1 network.host:192.168.10.49 2、elasticsearch启动 1 2 [root@ELKServerbin] #/usr/local/elasticsearch-2.3.4/bin/elasticsearch-d [root@ELKServerbin] #Exceptioninthread"main"java.lang.RuntimeException:don'trunelasticsearchasroot.' elasticsearch启动不能使用root用户。新建elk用户,并把elasticsearch目录用户所有者改成elk 1 [elk@ELKServerbin]$. /elasticsearch -d 查看elasticsearch是否启动 1 2 3 [elk@ELKServerbin]$ netstat -tnlp| grep java tcp00::ffff:192.168.10.49:9200:::*LISTEN2476 /java tcp00::ffff:192.168.10.49:9300:::*LISTEN2476 /java 3、测试logstansh和elasticsearch是否能结合使用 a、新建logstansh配置文件elasticsearch.conf 1 2 3 4 5 6 7 [root@ELKServerbin] #cd/usr/local/logstash-2.3.4/conf [root@ELKServerconf] #catelasticsearch.conf input{stdin{}} #手动输入 output{ elasticsearch{hosts=> "192.168.10.49" } stdout{codec=>rubydebug} #页面debug信息 } b、启动elasticsearch.conf配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@ELKServerconf] #logstash-felasticsearch.conf--verbose startingagent{:level=>:info} startingpipeline{: id => "main" ,:level=>:info} Settings:Defaultpipelineworkers:1 Usingmappingtemplatefrom{:path=>nil,:level=>:info} Attemptingto install template{:manage_template=>{ "template" => "logstash-*" , "settings" =>{ "index.refresh_interval" => "5s" }, "mappings" =>{ "_default_" =>{ "_all" =>{ "enabled" => true , "omit_norms" => true }, "dynamic_templates" =>[{ "message_field" =>{ "match" => "message" , "match_mapping_type" => "string" , "mapping" =>{ "type" => "string" , "index" => "analyzed" , "omit_norms" => true , "fielddata" =>{ "format" => "disabled" }}}},{ "string_fields" =>{ "match" => "*" , "match_mapping_type" => "string" , "mapping" =>{ "type" => "string" , "index" => "analyzed" , "omit_norms" => true , "fielddata" =>{ "format" => "disabled" }, "fields" =>{ "raw" =>{ "type" => "string" , "index" => "not_analyzed" , "ignore_above" =>256}}}}}], "properties" =>{ "@timestamp" =>{ "type" => "date" }, "@version" =>{ "type" => "string" , "index" => "not_analyzed" }, "geoip" =>{ "dynamic" => true , "properties" =>{ "ip" =>{ "type" => "ip" }, "location" =>{ "type" => "geo_point" }, "latitude" =>{ "type" => "float" }, "longitude" =>{ "type" => "float" }}}}}}},:level=>:info} NewElasticsearchoutput{:class=> "LogStash::Outputs::ElasticSearch" ,:hosts=>[ "192.168.10.49" ],:level=>:info} Startingpipeline{: id => "main" ,:pipeline_workers=>1,:batch_size=>125,:batch_delay=>5,:max_inflight=>125,:level=>:info} Pipelinemainstarted helloelasticsearch #这行是手动输入的 { "message" => "helloelasticsearch" , "@version" => "1" , "@timestamp" => "2016-07-28T14:20:09.460Z" , "host" => "0.0.0.0" } c、查看elasticsearch是否获取到了"hello elasticsearch" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@ELKServerconf] #curlhttp://localhost:9200/_search?pretty { "took" :45, "timed_out" : false , "_shards" :{ "total" :5, "successful" :5, "failed" :0 }, "hits" :{ "total" :1, "max_score" :1.0, "hits" :[{ "_index" : "logstash-2016.07.28" , "_type" : "logs" , "_id" : "AVYx4H2BdePMZ0WyBMGl" , "_score" :1.0, "_source" :{ "message" : "helloelasticsearch" , "@version" : "1" , "@timestamp" : "2016-07-28T14:20:09.460Z" , "host" : "0.0.0.0" } }] } } 4、安装elasticsearch插件 elasticsearch有很多插件:http://www.searchtech.pro/elasticsearch-plugins elasticsearch-head插件安装 1 2 3 4 5 6 7 [root@ELKServerlang-expression] #cd/usr/local/elasticsearch-2.3.4/bin/ [root@ELKServerbin] #./plugininstallmobz/elasticsearch-head ->Installingmobz /elasticsearch-head ... Tryinghttps: //github .com /mobz/elasticsearch-head/archive/master .zip... Downloading.................DONE Verifyinghttps: //github .com /mobz/elasticsearch-head/archive/master .zipchecksums if available... Installed head into /usr/local/elasticsearch-2 .3.4 /plugins/head 查看elasticsearch-head插件显示的页面 http://192.168.10.49:9200/_plugin/head/ 四、kibana安装 1、安装kibana 1 2 3 4 [root@ELKServer~] #tar-zxvfkibana-4.5.2-linux-x64.tar.gz [root@ELKServer~] #mvkibana-4.5.2-linux-x64/usr/local/ [root@ELKServer~] #cd/usr/local/kibana-4.5.2-linux-x64/config/ [root@ELKServerconfig] #vimkibana.yml 修改kibana配置文件,把下面这行改成elasticsearc的访问路径 1 elasticsearch.url: "http://192.168.10.49:9200" 2、启动kibana 1 2 3 4 5 6 7 8 9 10 11 12 [root@ELKServerbin] #/usr/local/kibana-4.5.2-linux-x64/bin/kibana& log[23:10:23.215][info][status][plugin:kibana]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.288][info][status][plugin:elasticsearch]Statuschangedfromuninitializedtoyellow-Waiting for Elasticsearch log[23:10:23.344][info][status][plugin:kbn_vislib_vis_types]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.377][info][status][plugin:markdown_vis]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.415][info][status][plugin:metric_vis]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.445][info][status][plugin:spyModes]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.464][info][status][plugin:statusPage]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.485][info][status][plugin:table_vis]Statuschangedfromuninitializedtogreen-Ready log[23:10:23.510][info][listening]Serverrunningathttp: //0 .0.0.0:5601 log[23:10:28.470][info][status][plugin:elasticsearch]Statuschangedfromyellowtoyellow-NoexistingKibanaindexfound log[23:10:31.442][info][status][plugin:elasticsearch]Statuschangedfromyellowtogreen-Kibanaindexready 3、测试kibana 访问页面:http://192.168.10.49:5601/ 五、ELK实例测试 1、简单介绍下ELK的数据传输过程 a、logstansh客户端根据日志存放路径采集日志(input),然后转给redis服务器缓存(output) b、logstansh服务端将消息从redie服务器拿出来(input),然后用filter对日志分割处理 c、logstansh服务端最后将处理好的日志转给ealsticsearch(output)存储 d、kibana通过ealsticsearch接口获取存储的数据并页面展示出来 在测试中我们没有对日志做filter处理 2、新建logstansh配置文件 logstash_redis.conf logstansh客户端配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 input{ file{ path=> "/var/log/messages" start_position=>beginning sincedb_write_interval=> 0 add_field=>{ "Host" => "192.168.10.47" } type=> "SYSLOG_LOG" } } output{ redis{ host=> "192.168.10.47:6379" data_type=> "list" key=> "logstash:syslog_log" } } redis_elasticserach.conf logstansh服务端配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 input{ redis{ host=> '192.168.10.47' data_type=> 'list' port=> "6379" key=> 'logstash:syslog_log' type=> 'redis-input' } } output{ elasticsearch{ hosts=> "192.168.10.47" index=> "logstash-%{+YYYY.MM.dd}" } } 2、启动ELK各项服务 1 2 3 4 5 logstash-flogstash_redis.conf& logstash-fredis_elasticsearch.conf& /etc/init .d /redis_6379 start /usr/local/elasticsearch-2 .3.4 /bin/elasticsearch -d(elk用户启动) /usr/local/kibana-4 .5.2-linux-x64 /bin/kibana & 3、检查日志传输是否正常 a、查看elasticsearch数据信息 http://192.168.10.49:9200/_plugin/head/ b、查看kibana是否有数据显示 http://192.168.10.49:5601/ 注意:因为上面从message获取的日志是日志文件首行开始获取,时间可能是几天前的。 在kibana查看数据是注意选择时间范围 本文转自 irow10 51CTO博客,原文链接:http://blog.51cto.com/irow10/1832053,如需转载请自行联系原作者

优秀的个人博客,低调大师

java管理hdfs文件的常用类小结

最近在写一些hadoop的运维工具,考虑到hadoop本身是java编写的,api比较方便,可以直接拿来就用 准备用java来写。 今天测试了几个fs相关的类。 主要有FileStatus,FileSystem,DistributedFileSystem,DatanodeInfo,BlockLocation FileStatus是和文件的属性相关的类,比如文件的名称,大小,属主等 主要的取值方法有: getPath,getLen,getModificationTime,getAccessTime,getReplication,getOwner,getGroup,getPermission等,通过字面意思就可以很容易的理解其功能 FileSystem是一个抽象类,常见的具体实现类是LocalFileSystem和DistributedFileSystem 常见的方法: listStatus 查看目录下的文件属性,返回FileStatus数组,getFileStatus 查看一个文件的属性,返回FileStatus copyToLocalFile hdfs到本地复制,copyFromLocalFile 本地到hdfs复制,exists 判断文件是否存在,参数为Path,getLocal 返回本地文件系统,LocalFileSystem getFileBlockLocations ,返回BlockLocation的数组,参数是FileStatus 等 DatanodeInfo是和datanode有关的类,主要是包含了datanode的相关信息,主要有容量,打开文件数,主机名,ip等信息,比如查看整个hdfs集群的存储状态(dfsadmin report)就是调用了 getDatanodeReport方法。 BlockLocation包含了block所在的datanode的信息,可以用来查看一个文件的block的具体信息,比如大小,所在主机,是否为坏块等 综上,可以用FileStatus来获取文件的属性,FileSystem的具体实现类来对文件做操作,用DatanodeInfo来获取datanode的信息,BlockLocation来看文件到block的对应关系 下面列举两个例子: 例1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.protocol.DatanodeInfo; import org.apache.hadoop.fs.BlockLocation; import static java.lang.System.out; public class FileStatusTest{ private static Configurationconfig= new Configuration(); private static FileSystemhdfs= null ; private static FileStatus[]status= null ; public static void main(String[]args) throws IOException{ List<String>namelist= new ArrayList<String>(); config.addResource( "hdfs-site.xml" ); config.addResource( "core-site.xml" ); out.println(config.get( "dfs.namenode.name.dir" )); out.println(config.get( "fs.defaultFS" )); FileSystemhdfs=FileSystem.get(config); out.println(hdfs.getClass().getName()); Stringfile=args[ 0 ]; try { if (!hdfs.exists( new Path(file))){ return ; } status=hdfs.listStatus( new Path(file)); out.println( "filenumis" +status.length); for (FileStatusf:status){ namelist.add(f.getPath().toString()); out.println( "filenameis" +f.getPath()); } } catch (Exceptione){ e.printStackTrace(); } } } 例2: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.protocol.DatanodeInfo; import org.apache.hadoop.fs.BlockLocation; import static java.lang.System.out; public class FileStatusTest{ private static Configurationconfig= new Configuration(); private static FileSystemhdfs= null ; private static FileStatus[]status= null ; public static void main(String[]args) throws IOException{ List<String>namelist= new ArrayList<String>(); List<String>hostlist= new ArrayList<String>(); config.addResource( "hdfs-site.xml" ); config.addResource( "core-site.xml" ); out.println(config.get( "dfs.namenode.name.dir" )); out.println(config.get( "fs.defaultFS" )); FileSystemhdfs=FileSystem.get(config); try { DistributedFileSystemdishdfs=(DistributedFileSystem)hdfs; DatanodeInfo[]nodeStats=dishdfs.getDataNodeStats(); String[]names= new String[nodeStats.length]; for ( int i= 0 ;i<nodeStats.length;i++){ out.println( "hostnameis" +nodeStats[i].getName()); out.println( "dfsusedis" +nodeStats[i].getDfsUsed()); out.println(nodeStats[i].getDatanodeReport()); } } catch (Exceptione){ e.printStackTrace(); } out.println(hdfs.getClass().getName()); Stringfile=args[ 0 ]; try { if (!hdfs.exists( new Path(file))){ return ; } status=hdfs.listStatus( new Path(file)); out.println( "filenumis" +status.length); for (FileStatusf:status){ namelist.add(f.getPath().toString()); out.println( "filenameis" +f.getPath()); BlockLocation[]blks=hdfs.getFileBlockLocations(f, 0 ,f.getLen()); for (BlockLocationblk:blks){ out.println( "blknameis" +blk.toString()); out.println( "lengthis" +blk.getLength()); } } } catch (Exceptione){ e.printStackTrace(); } } } 本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1528510,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册