In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-02-24 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Servers >
Share
Shulou(Shulou.com)06/01 Report--
Editor to share with you what is suitable for system management novice bash script programming, I believe that most people do not know much about it, so share this article for your reference, I hope you can learn a lot after reading this article, let's go to know it!
UNIX shell is essentially an interface between the user, the kernel, and the system hardware. On any UNIX or Linux system, shell is very important and is one of the most critical aspects of learning proper system management and security. Shell is usually driven by CLI and can directly control or destroy the system. The open source bash shell discussed in this article is one of the largest, most practical and extensible shell. In this article, you will learn the basic techniques of bash scripting, how to use it every day, and how to use it to create reliable shell scripts.
Commonly used acronyms
API: application programming interface
CLI: command line interface
SNMP: simple Network Management Protocol
History of bash shell
Bourne Again Shell (bash) was born in 1987 and was developed as a GNU project and was quickly adopted by many Linux distributions. Currently, there are many different versions of bash that are available for free.
One of the advantages of bash is that it has built-in security features. Bash accurately records the commands entered by the user and writes the record to the hidden file .bash _ history in the user's home directory. Therefore, if you implement bash, it is easy to track system users more closely. In fact, for many Linux systems, bash is often the default pre-installed shell environment.
Bash's command syntax and keywords are derived from and improved in the architectural and technical details of Korn shell (ksh) and C shell (csh). In addition, the syntax of bash has many extensions that other shell does not have. Integer calculations in bash are more efficient than other shell, and bash makes it easier to redirect standard output (stdout) and standard error (stderr).
Bash is also well suited for security-demanding environments with a restricted startup mode that restricts users in shell to only execute a defined set of commands. You can customize the login shell by editing your own bash shell login control files (that is, hidden files such as .bashrc, .bash _ profile, .bash _ logout, and .profile).
The usage and function of bash shell
To write effective bash shell scripts, you must master the basic set of bash commands that perform navigation and daily tasks in shell.
Bash login process
When logging in, users typically execute a global profile and two personal files (.bash _ profile and .bashrc). Figure 1 shows the usual process.
Figure 1. Bash shell login process
Now, take a look at the typical .bash _ profile (listing 1) and .bashrc (listing 2) scripts for Linux users. These scripts are loaded from the user's home directory.
Listing 1. Typical .bash _ profile file
[fred.smythe@server01] $cat .bash _ profile# .bash _ profile# Get the aliases and functionsif [- f ~ / .bashrc]; then. ~ / .bashrcfi # User specific environment and startup programsexport JAVA_HOME=/usr/java/defaultexport PATH=$JAVA_HOME/bin:$PATHPATH=$PATH:$HOME/binexport PATH
In the .bashrc file in listing 2, some user aliases are configured and the global bashrc file, if any, is loaded.
Listing 2. Typical .bashrc file
[fred.smythe@server01 ~] $cat .bashrc # .bashrc # User specific aliases and functionsalias rm='rm-i'alias cp='cp-i'alias mv='mv-i'alias tc6='cd / opt/tomcat/6.0.13'alias conf6='cd / opt/tomcat/6.0.13/conf'alias bin6='cd / opt/tomcat/6.0.13/bin'alias scr='cd / opt/tomcat/scripts'alias reports='cd / opt/tomcat/reports'alias temp6='cd / opt/ Tomcat/6.0.13/template'# Source global definitionsif [- f / etc/bashrc] Then. / etc/bashrcfi
Figure 2. Details of the bash shell login process
After that, the user can use the standard command set specified in the bash shell environment variable $PATH. If a command is not in the user's $PATH, but the user has permission to execute the command, you must use the full path, as shown in listing 3.
Listing 3. Example of the $PATH problem in bash shell
[fred.smythe@server01 ~] $ifconfig-a-bash: ifconfig: command not found [fred.smythe@server01 ~] $which ifconfig/usr/bin/which: no ifconfig in (/ usr/local/bin:/bin:/usr/bin:/home/fred.smythe/bin)
The reason for this problem is that the binary ifconfig is not in the user-defined PATH variable. However, if you know the full path to this command, you can execute it like listing 4.
Listing 4. Use the full path of the command to solve the $PATH problem in bash shell
[fred.smythe@server01 ~] $/ sbin/ifconfig-aeth0 Link encap:Ethernet HWaddr 00:50:56:96:2E:B3inet addr:10.14.33.60 Bcast:10.14.33.255 Mask:255.255.255.0
Listing 5 shows a way to solve this problem using aliases. In a bash script, you may want to run the command with the full path, depending on who will run the script.
Listing 5. Solve the $PATH problem in bash shell by setting aliases
[fred.smythe@server01 ~] $alias ifconfig='/sbin/ifconfig' [fred.smythe@server01 ~] $ifconfigeth0 Link encap:Ethernet HWaddr 00:50:56:96:2E:B3inet addr:10.14.33.60 Bcast:10.14.33.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1forking
The command or bash shell itself may start (or generate) a new shell child process to perform a task, which is called forking. While this new process (child process) is executing, the parent process is still running. If the parent process dies before the child process, then the child process becomes a dead process (also known as a zombie process), which often causes the process or application to hang. Therefore, suspended processes must be killed or terminated in an unconventional way. Although the parent process can access the process ID of its child process and pass parameters to it, not the other way around. When the shell script process exits or returns to the parent process, the exit code should be 0. If it is another value, there is likely to be an error or problem with the process.
The exit code of a command executed (echo $?) See listing 6.
Listing 6. Example of exit code
# ls-ld / tmpdrwxrwxrwt 5 root root 4096 Aug 19 19:45 / tmp [root@server01 ~] # echo $? 0 / / Good command return of 0. [root@server01 ~] # ls-l / junkls: / junk: No such file or directory [root@server01 ~] # echo $? 2 / / Something went wrong, there was an error, so return 2.
Listing 7 shows the parent and child processes in the bash environment.
Listing 7. Example of parent and child processes in a bash environment
[root@server02 htdocs] # ps-ef | grep httpdUID PID PPID C STIME TTY TIME CMDroot 8495 10 Jul26? 00:00:03 / usr/sbin/httpd-k startapache 9254 8495 0 Aug15? 00:00:00 / usr/sbin/httpd-k start
Understand one's own environment
If you enter the command env, you will see the currently set value of the bash shell default environment variable, including your user name and tty (terminal) information, the $PATH value, and the current working directory ($PWD). Take a look at listing 8.
Listing 8. Example of a bash environment
[fred.smythe@server01 ~] $envHOSTNAME=server01TERM=screenSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=10.12.132.3 56513 22SSHbands TTY instruments stop devpts0USERfred.smytheLSparts COLORSNozzled 00fied01Terry.btm01it34lntransition01mit.batter01mit01mit01mit01tter01riuzoror01trans05poli0510371041ut01MICS 01Ex01bot 41USERVER 032mono. Exe01or 32mono com132fre.btmm01103132mono .btmm0132purp .btmm01103132ubi.csh01 Tazhong 01th 31position circle .tgzpet 01th 31position horse. Tazhou 01th 31position. Tazhong 01th 31position. Tazhou 01cle31position. Zippole 01clew. ZZO1TH 31mm. Gz01x 31p. 35:MAIL=/var/spool/mail/fred.smythePATH=/usr/local/bin:/bin:/usr/bin:/home/fred.smythe/binINPUTRC=/etc/inputrcPWD=/home/fred.smytheLANG=en_US.UTF-8SHLVL=1HOME=/home/fred.smytheLOGNAME=fred.smytheSSH_CONNECTION=10.14.43.183 56513 10.14.43.43 22LESSOPEN = | / usr/bin/lesspipe.sh% sG_BROKEN_FILENAMES=1_=/bin/env
File system navigation
You can use the bash command shown in listing 9 to navigate the Linux file system.
Listing 9. Navigate in a bash environment
[fred.smythe@server01 ~] $ls-ltotal 0 [fred.smythe@server01 ~] $cd / tmp [fred.smythe@server01 tmp] $df-ha .Filesystem Size Used Avail Use% Mounted on/dev/mapper/vg_root-lv_tmp2.0G 68m 1.8G 4% / tmp
In this listing, only one command is executed at a time. However, you can also run them together using the semicolon (;) delimiter, as shown in listing 10.
Listing 10. Execute commands continuously in bash
[fred.smythe@server01 tmp] $ls-l; cd / tmp Df-ha .total RWUV r-1 root root 1748 May 22 2009 index.html-rw-r- 1 root root 786 Aug 17 04:59 index.jspdrwx- 2 root root 16384 Jul 15 2009 lost+founddrwx- 2 root root 4096 Aug 9 21:04 vmware-rootFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_root-lv_tmp2.0G 68M 1.8G 4% / tmp [fred.smythe@server01 tmp] $
On the bash command line, the command completion feature reduces the amount of input required for daily tasks. Just enter the beginning of the command and press Tab. Note that if a command or file cannot be accessed due to permission restrictions, command completion is also invalid.
Get help in bash
Bash provides several forms of help:
Man:
Listing 11. Example of a man page in bash
[fred.smythe@server01 tmp] $man perlPERL (1) Perl Programmers Reference Guide PERL (1) NAMEperl-Practical Extraction and Report LanguageSYNOPSISperl [- sTtuUWX] [- hv] [- V [: configvar]]-cw] [- d [t] [: debugger]] [- D [num- ber/list]] [- pna] [- Fpattern] [- l [octal]] [- 0 [octal/hexadecimal]] [- Idir] [- m [-] module] [- M [-] module... [- f] [- C [number/list]] [- P] [- S] [- x [dir]] [- I [extension]] [- e command] [- -] [program- file] [argument].
Whatis:
Listing 12. Example of the whatis command in bash
[fred.smythe@server01 tmp] $whatis perlperl (1)-Practical Extraction and Report Languageperl (rpm)-The Perl programming language
Apropos:
Listing 13. Apropos example in bash
[root@server01 ~] # apropos perl | moreB (3pm)-The Perl CompilerB::Asmdata (3pm)-Autogenerated data about Perl ops,used togenerate bytecodeB::Assembler (3pm)-Assemble Perl bytecode
Which:
Listing 14. Which command in bash
[root@server01 ~] # which perl/usr/bin/perl
Bash shell contains two types of commands: internal built-in commands and external programs (or external filters and commands, which are usually self-contained binary program files). Listing 15 shows how to use the alias command to find built-in commands in bash.
Listing 15. Look for built-in commands in bash
[root@server01 ~] # man-k builtins | more. [builtins] (1)-bash built-in commands, see bash (1): [builtins] (1)-bash built-in commands, see bash (1) [[builtins] (1)-bash built-in commands, see bash (1) alias [builtins] (1)-bash built-in commands, see bash (1) bash [builtins] (1)-bash built-in commands, see bash (1) bg [builtins] (1)-bash built-in commands See bash (1) bind [builtins] (1)-bash built-in commands, see bash (1) break [builtins] (1)-bash built-in commands, see bash (1) builtin [builtins] (1)-bash built-in commands, see bash (1)
You can use the type command to find specific commands in bash, as shown in listing 16.
Listing 16. Use the type command to find built-in commands
[root@apache-02 htdocs] # type lsoflsof is / usr/sbin/ [root @ apache-02 htdocs] # type aliasalias is a shell builtin
Listing 17 shows an example of the external command lsof. This command is actually a binary file that resides in the Linux file system; it is installed through a package of the same name.
Listing 17. Look for external command details in bash
[root@server01] # which lsof/usr/sbin/lsof [root@server01 ~] # rpm-qa lsof-4.78-3.i386 [root@server01 ~] # rpm-qa lsoflsof-4.78-3.i386
Real-time bash script programming
One of the great features of bash shell * * is that it allows real-time command line scripting. For example, the example in listing 18 sets a shell variable, checks the value of the variable, and automatically executes another command if the value is greater than zero.
Listing 18. Real-time scripting with bash
[fred.smythe@server01 ~] $DEBUG=1 [fred.smythe@server01 ~] $test $DEBUG-gt 0 & & echo "Debug turned on" Debug turned on
The following is an example of a for loop written in real time (see listing 19). Notice that here you enter interactively at the shell prompt; after each >, enter the next line of the interactive shell script.
Listing 19. A for loop written instantly in bash
$for SVR in 1 2 3 > do > echo server0 $SVR.example.com > doneserver01.example.comserver02.example.comserver03.example.com
Note that this code can also be run as a semicolon-separated sequential command.
Use keywords
The for command is not a program, but a special built-in command called a keyword. The list of keywords for the general bash version on Linux is shown in listing 20.
Listing 20. Keywords in bash
True, false, test, case, esac, break, continue, eval, exec, exit, export, readonly,return, set, shift, source, time, trap, unset, time, date, do, done, if, fi, else, elif,function, for, in, then, until, while, select
When choosing names for shell variables, you should avoid using these keywords (also known as bash shell reserved words).
Using Pipeline Transportation Command in bash
Bash shell allows you to redirect standard input, standard output, and standard error on Linux or UNIX systems. Take a look at the example in listing 21.
Listing 21. Using Pipeline Transportation Command in bash
$USER= "fred.smythe" $echo-n "User $USER home is:" & & cat / etc/passwd | grep $USER | awk-F:'{print $6} 'User fred.smythe home is: / home/fred.smythe$# Re-direction of standard output (>) of the date command to a file: [root@server01 ~] # date > / tmp/today.txt [root@server01 ~] # cat / tmp/today.txtThu Aug 19 19:38:33 UTC 201 Re-direction of standard input ()... [root@server01 ~] # cat
< /tmp/today.txt >/ tmp/today.txt.backup [root@server01 ~] # cat / tmp/today.txt.backupThu Aug 19 19:38:33 UTC 2010
Compound command line
The compound command line can use and combine multiple instances of standard input, standard output, and standard error redirection and / or pipes to perform complex operations with high accuracy. Listing 22 provides an example.
Listing 22. An example of performing a redirection in bash
# command1
< input_file1.txt >Output_file1.txt# command1 | command2 | command3 > output_file.log
For example, by using a complex combined command line, you can find out the number of Apache denied permission errors by searching all compressed error logs found and counting the number of errors.
$find. /-name 'error_log.*.gz' | xargs zcat | grep' Permission denied' | wc-L3
Write high-quality bash scripts
To complete production quality or enterprise-level scripting, you must keep the following points in mind:
Be sure to annotate the script with a short title.
Add enough comments so that you can easily remember why you wrote the code later. Remember that the * line of the script must be a #! / bin/bash line.
The actions of the script should be recorded in a log file with a date and time stamp for later inspection. The output should be detailed, the success message should be logged and the error message or condition should be clearly stated. It may also make sense to record the start and stop times of the script. You can use the tee command to write messages to both the log and standard output:
DATEFMT= `date "+% m/%d/%Y% H:%M:%S" `echo "$DATEFMT: My message" | tee-a / tmp/myscript.log |
If the script is going to write to a log file, you should create a new log file and include dates, hours, minutes, or even seconds in the log file name. In this way, you can use a simple find command to loop and compress the script's log each time you run the script:
DATELOG= `date "+% m%d%y" `LOGFILE= "/ data/maillog/mail_stats.log.$DATELOG" # gzip the old mail_stats logs, older than 7 daysfind / logs-type f-name "mail_stats.log.?"-mtime + 7 | xargs gzip-qualified remove the old gzipped mail_stats logs after 30 daysfind / logs-type f-name "mail_stats.log.*.gz"-mtime + 30-exec rm {}\ # mail_log utility log resetsecho "" > / var/log/mail_stats.log.$DATELOG
You should add error-checking logic to your script and don't assume that anything is correct. This will reduce a lot of troubles and setbacks in the future.
Use functions and shell script libraries in scripts whenever possible (by importing another script). Doing so reuses tested and reliable code, avoids repetitive scripting, and reduces errors.
To filter input parameters provided by the user:
NUMPARAMETERS= "$#" if [$NUMPARAMETERS! = 3]; thenecho "Insufficient number of parameter passed!" echo "Please run script in format. / myscript.sh $1 $2 $3" exit 2fi
Consider adding debug mode or functionality to your script-such as using the set-x command.
Add the ability to alert certain events to the script. You can use the SNMP command or an audible ringtone (echo x) to sound the alarm, and then use the mail command to send an email.
If the user will use your script as if it were an interactive menu, consider the user's environment shell and the commands they have access to. If you are not sure, all commands in the script should use the full path.
Add a unique return code to the bash shell script. In this way, when writing a large script, you can easily find the exact location of the error or problem based on the return code:
If ["$ERRCHECK"! = ""]; thenecho "Error Detected: $ERRCHECK! Cannot continue, exit $EXITVAL value" exit $EXITVALfi
In a lab environment, fully test the script for all situations that may occur. You should also have other users test the script and let them deliberately try to "break" the script.
If the script manipulates input data from the user or data input file, be sure to fully filter, check, and verify the input data. Scripts that manipulate data lists should be able to handle multiple different sets of data lists.
For long-running scripts, consider adding a timeout feature to the script to terminate or stop the script after n minutes:
Stty-icannon min 0 time 1800
Indent the code appropriately to increase the readability of the code.
For scripts for special purposes, you may want to add interactive warning messages to explain the purpose of the script to the user. For example, the script in listing 23 gets the remote log and creates a report email.
Listing 23. A simple bash script to get and report logs
#! / bin/bashcd / data01/maillogMAILSVRS=$ (/ bin/cat / data01/maillog/mail_servers) DATELOG= `date "+% m%d%y" `ALLMAILLOGS= "/ data01/maillog/all_svr_maillogs.$DATELOG" MAILREPORT= "/ data01/maillog/all_svr_maillogs.report.$DATELOG" MAILADDRESSES=$ (/ bin/cat / data01/maillog/addresses) MAILADMINS= "admin1@example.com, admin2@example.com" MAILSTATSLOGALL= "/ data01/maillog/mailstats.log.all.$DATELOG" DELDAYSLOGS=10echo "Mail Report to $MAILADMINS" # 1-Get some logs … For svr in $MAILSVRSdoif [- e "/ data01/maillog/$svr.maillog.$DATELOG.gz"] Then/bin/rm-f / data01/maillog/$svr.maillog.$DATELOG.gzfidone# 2-Combine all maillogs from all servers to onefile ($ALLMAILLOGS)... / bin/zcat server16.maillog.$DATELOG.gz server17.maillog.$DATELOG.gzserver18.maillog.$DATELOG.gz server19.maillog.$DATELOG.gz > > $ALLMAILLOGS# 3-Run another script/bin/cat $ALLMAILLOGS | / data01/maillog/mymailstats.pl | tee-a $MAILREPORT# 4-Get all of the mailstats logs to one log file to send by Email/bin/cat / data01/maillog/ Mailstats.log.server*.$DATELOG > $MAILSTATSLOGALL# Send the $MAILADMINS the mail reports/bin/cat $MAILSTATSLOGALL | mail-s "ACME Servers Outbound Mail Serversmailstats:$DATELOG" $MAILADMINS
Variables, grammatical formats and structures in bash scripting
In bash, you can define and set variables in several ways. The script in listing 24 shows examples of these shell variable declaration methods.
Listing 24. Define bash variables
$cat a.shystack racket Binder bashA = "String Value 1" B='String Value 2'C=9675D=96.75export E = "String Value 3" # if the variable $F is not ALREADY set to a value, assign "String Value 4". Frag ${String Value = "String Value 4"} echo "Aids", "echo" Bones B "echo" C "echo" cards D "echo" E E "echo" Fathers F "exit 0 $. / a.shA=String Value 1B=String Value 2C=9675D=96.75E=String Value 3F=String Value 4
Collect user input
To collect user input, use the read statement and assign a variable to the user input, as shown in listing 25.
Listing 25. Get user input in bash script
$cat account.shrunken raceme bind Bash echo "Please enter your first and last name:" read ansecho "Hellow $ans, welcome to bash scripting...!" exit 0 $. / prompt.shPlease enter your first and last name:Joe JacksonHello Joe Jackson, welcome to bash scripting...!
To use a function in a bash shell script, use the method shown in listing 26.
Listing 26. Implement the function in bash
$cat function.shrunken funcOne Server01 exit 0 $() {echo "Running function 1, with parameter $1" dateecho "Current listing / tmp directory, last 3 lines" ls-lrt / tmp | tail-3} echo "Hello World" funcOne "Server01" exit 0 $. / function.shHello WorldRunning function 1, with parameter Server01Sun Aug 22 22:43:04 UTC 2010Current listing / tmp directory Last 3 lines-rw-r- 1 dsmith progdevel 12749743 Aug 16 20:32 files.tar.gzdrwxr-xr-x 2 jjones progdevel 4096 Aug 16 20:42 ff_hosting_files-rw-r- 1 rhill heng 1440 Aug 22 19:07 myscript.log
You can also write functions like listing 27.
Listing 27. Another function definition in bash
#! / bin/bashfunction funcTwo () {echo "Running function 2, with parameter $1" dateecho "Current listing / var directory, last 3 lines" ls-lrt / var | tail-3} funcTwo "Server02" exit 0 $. / function.shRunning function 2, with parameter Server02Sun Aug 22 22:53:16 UTC 2010Current listing / var directory, last 3 linesdrwxrwxrwt 3 root root 4096 Aug 6 18:22 tmpdrwxr-xr-x 6 root root 4096 Aug 22 04:02 logdrwxrwxr-x 4 root lock 4096 Aug 22 04:22 lock
The function keyword is optional. The only rule is that a function must be defined before it can be used in a program. The method to call a function is to call its name and pass the required or optional input parameters.
Cycle and decision-making
Suppose you need to perform some repetitive work on several servers. In bash, you can easily achieve this using a for loop. Listing 28 shows the code.
Listing 28. An example of bash script programming for a simple for loop
$SERVERS= "server01 server02 server03 server04 server05" for i in $SERVERSdoecho "Removing file from server: $I" ssh $I rm-f / tmp/junk1.txtdone
The while loop in bash can repeat the statement for a certain number of times or until a condition is met. Listing 29 shows an example.
Listing 29. Simple while loop
LOOPCTR=1while [$LOOPCTR-lt 6] doecho "Running patch script for server0 $LOOPCTR" / data/patch.sh server0 $LOOPCTRLOOPCTR= `expr $LOOPCTR + 1`done
The case statement in bash can be used to test multiple conditions or values and perform actions accordingly. Sometimes, using this statement is better than nested for loops or if statements, reducing repetitive code and having a clearer structure. Listing 30 shows a short case statement that calls the function based on the value of the variable $key.
Listing 30. Example of case statement in bash
Case $key inq) logit "Quit"; exit;;1) echo "\ tChecking Mail Servers"; check_mail_servers;;2) echo "\ tChecking Web Servers"; check_web_servers;;3) echo "\ tChecking App Servers;check_app_servers;;4) echo"\ tChecking Database Servers "; check_database_servers;;b) echo" Go Back to Main menu "; MENUFLAG=" main "; main_menu;;*) echo" $key invalid choice "; invalid;;esac
Advantages and disadvantages of bash script programming
Do you need to finish some tasks quickly? If you have mastered bash, you can write web components of * * very easily, which can greatly reduce the time required. Bash scripting is not a programming language or application. No compiler is required, nor does it require a special library or software development environment. However, bash shell scripts behave like an application and can even perform some of the tasks and work that the application can do.
On the bright side:
Bash provides rapid development and easy code modification. The basic method of bash scripting hardly changes over time.
Compared with the code rules or syntax of some programming languages that may change frequently, the syntax of bash is quite simple and straightforward.
Advanced bash features provide users with more capabilities than ever before (for example, epoch, function, signal control, multiple extensions, command history, methods of using one-dimensional arrays).
Only * nix bash shell is required for bash shell scripting.
On the bad side, the bash code:
It is executed by shell and then passed to the kernel, which is usually slower than binary programs that are compiled into pure machine code. As a result, bash shell scripting may not be applicable to some application designs or functions.
They are plaintext, and anyone with read permission can easily read them, while compiled binaries are unreadable. The use of plaintext is a serious security risk when coding sensitive data.
There is no specific set of standard functions, and many modern programming languages have built-in functions that can meet a variety of programming needs.
These are all the contents of the article "what are the bash scripting programs suitable for novice system management?" Thank you for reading! I believe we all have a certain understanding, hope to share the content to help you, if you want to learn more knowledge, welcome to follow the industry information channel!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.