indesign 中chapterindesign怎么设置页码

Chapter 13. 系统与管理命令
Chapter 13. 系统与管理命令
[摘要:正在/etc/rc.d目次中的启动战闭机剧本中包括了很多多少有效的(战出用的)那些体系治理敕令. 那些敕令平常老是被root用户应用, 用取体系保护或是急迫文件体系建复.肯定要谨慎应用那些对象]
在/etc/rc.d目录中的启动和关机脚本中包含了好多有用的(和没用的)这些系统管理命令. 这些命令通常总是被root用户使用, 用与系统维护或者是紧急文件系统修复.一定要小心使用这些工具, 因为如果滥用的话, 它们会损坏你的系统.
Users 和 Groups 类命令 users 显示所有的登录的用户. 这个命令与 who -q 基本一致. groups 列出当前用户和他所属于的组.
这相当于 $GROUPS 内部变量,
但是这个命令将会给出组名字, 而不是数字.
bash$ groups
bozita cdrom cdwriter audio xgrp
bash$ echo $GROUPS
501chown, chgrp chown 命令将会修改一个或多个文件的所有权. 对于root来说这是一种非常好的将文件的所有权从一个用户换到另一个用户的方法. 一个普通用户不能修改文件的所有权, 即使他是文件的宿主也不行.
root# chown bozo *.txt
chgrp 将会修改一个或个文件党组所有权. 你必须是这些文件的宿主, 并且是目的组的成员(或者root), 这样才能使用这个操作.
chgrp --recursive dunderheads *.data #
"dunderheads"(译者: 晕,蠢才...) 组现在拥有了所有的&*.data&文件. #+ 包括所有$PWD目录下的子目录中的文件(--recursive的作用就是包含子目录).useradd, userdel useradd 管理命令将会在系统上添加一个用户帐号, 并且如果指定的话, 还会为特定的用户创建home目录. 相应的userdel 命令将会从系统上删除一个用户帐号,
并且删除相应的文件. adduser命令与useradd是相同的, adduser通常都是一个符号链接.usermod 修改用户帐号. 可以修改密码, 组身份, 截止日期, 或者给定用户帐号的其他的属性. 使用这个命令, 用户的密码可能会被锁定, 因为密码会影响到帐号的有效性. groupmod 修改指定组. 组名字或者ID号都可以使用这个命令来修改. id id 将会列出当前进程的真实和有效用户ID, 还有用户的组ID。 这与Bash的内部变量 $UID,
$EUID, 和 $GROUPS 很相像.
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)
bash$ echo $UID
501id 命令只有在有效ID与真实ID不符时才会显示有效id. 参见 Example 9-5. who 显示系统上所有已经登录的用户.
Apr 27 17:45
Apr 27 17:46
Apr 27 17:47
Apr 27 17:49
-m 选项将会只给出当前用户的详细信息. 将任意两个参数传递到who中 都等价于who
-m, 就像 who am i 或者 who
bash$ who -m
localhost.localdomain!bozo
Apr 27 17:49
whoami 与who
-m 很相似, 但是只列出用户名.
bash$ whoami
w 显示所有的登录的用户和属于它们的进程. 这是一个who的扩展版本. w的输出可以通过管道传递到grep中, 这样就可以查找指定的用户或进程.
bash$ w | grep startx
startxlogname 显示当前用户的登录名(可以在/var/run/utmp中找到). 这与上边的whoami很相近.
bash$ logname
bash$ whoami
bozo 然而... bash$ su
Password: ......
bash# whoami
bash# logname
bozologname只会打印出登录的用户名, 而whoami 将会给出附着到当前进程的用户名. 就像我们上边看到的那样, 这两个名字有时会不同.su 使用一个代替的用户来运行一个程序或脚本. su rjones 将会以 rjones 来启动一个shell. 一个不加参数的su默认就是root.
参见 Example A-15. sudo 以root(或其他用户)的身份来运行一个命令. 这个命令可以运行在脚本中, 这样就允许以正规的用户身份来运行脚本. #!/bin/bash
# 一些命令. sudo cp /root/secretfile /home/bozo/secret # 一些命令. 文件 /etc/sudoers 持有允许调用sudo的用户名. passwd 设置, 修改, 或者管理用户的密码. passwd 命令可以用在脚本中, 但可能你不想这么用. Example 13-1. 设置一个新密码
#!/bin/bash #
setnew-password.sh: 只用于说明目的. #
如果真正运行这个脚本并不是一个好主意. #
这个脚本必须以root身份运行.
ROOT_UID=0
# Root 的 $UID 0. E_WRONG_USER=65
# 不是 root?
E_NOSUCHUSER=70 SUCCESS=0
if [ "$UID" -ne "$ROOT_UID" ] echo "Only root can run this script."; echo
exit $E_WRONG_USER else
echo "You should know better than to run this script, root."
echo "Even root users get the blues... "
username=bozo NEWPASSWORD=security_violation
# 检查bozo是否在这里. grep -q "$username" /etc/passwd if [ $? -ne $SUCCESS ] then
echo "User $username does not exist."
echo "No password changed."
exit $E_NOSUCHUSER fi
echo "$NEWPASSWORD" | passwd --stdin "$username" #
'passwd'命令 '--stdin' 选项允许 #+ 从stdin(或者管道)中获得一个新的密码. echo "User $username's password changed!"
# 在脚本中使用'passwd'命令是很危险的.
exit 0 passwd 命令的 -l,
-u, 和 -d 选项允许锁定, 解锁,和删除一个用户的密码. 只有root用户可以使用这些选项. ac 显示用户登录的连接时间, 就像从 /var/log/wtmp 中读取一样. 这是GNU的一个统计工具. bash$ ac
68.08last 用户最后登录的信息, 就像从/var/log/wtmp中读出来一样. 这个命令也可以用来显示远端登录. 比如, 显示最后几次系统的重启信息: bash$ last reboot
system boot
2.6.9-1.667
system boot
2.6.9-1.667
system boot
2.6.9-1.667
system boot
2.6.9-1.667
wtmp begins Tue Feb
1 12:50:09 2005newgrp 不用登出就可以修改用户的组ID. 并且允许存取新组的文件. 因为用户可能同时属于多个组, 这个命令很少被使用.
终端类命令 tty 显示当前用户终端的名字.
注意每一个单独的xterm窗口都被算作一个不同的终端.
/dev/pts/1stty 显示并(或)修改终端设置. 这个复杂命令可以用在脚本中, 并可以用来控制终端的行为和其显示输出的方法. 参见这个命令的info页, 并仔细学习它.
Example 13-2. 设置一个擦除字符
#!/bin/bash # erase.sh: 在读取输入时使用"stty"来设置一个擦除字符.
echo -n "What is your name? " read name
试试退格键
#+ 来删除输入的字符.
有什么问题? echo "Your name is $name."
stty erase '#'
将 "hashmark" (#) 设置为退格字符. echo -n "What is your name? " read name
使用#来删除最后键入的字符. echo "Your name is $name."
# 警告: 即使在脚本退出后, 新的键值还是保持设置.(译者: 使用stty erase '^?' 恢复)
exit 0 Example 13-3. 关掉终端对于密码的echo
#!/bin/bash # secret-pw.sh: 保护密码不被显示
echo echo -n "Enter password " read passwd echo "password is $passwd" echo -n "If someone had been looking over your shoulder, " echo "your password would have been compromised."
echo && echo
# 在一个&与列表&中产生2个换行.
stty -echo
# 关闭屏幕的echo.
echo -n "Enter password again " read passwd echo echo "password is $passwd" echo
# 恢复屏幕的echo.
# 详细的阅读stty命令的info页, 以便于更好的掌握这个有用并且狡猾的工具. 一个具有创造性的stty命令的用法,
检测用户所按的键(不用敲回车).
Example 13-4. 按键检测
#!/bin/bash # keypress.sh: 检测用户按键 ("hot keys").
old_tty_settings=$(stty -g)
# 保存老的设置(为什么?). stty -icanon Keypress=$(head -c1)
# 或者 $(dd bs=1 count=1 2> /dev/null)
# 在非GNU的系统上
echo echo "Key pressed was ""$Keypress""." echo
stty "$old_tty_settings"
# 恢复老的设置.
# 感谢, Stephane Chazelas.
exit 0 参见 Example 9-3.
在使用canonical模式的时候, 可以对本地终端行编辑器所定义的特殊按键进行重新定义.
bash$ cat > filexxx
wha<ctl-W>I<ctl-H>foo bar<ctl-U>hello world<ENTER>
<ctl-D>
bash$ cat filexxx
hello world
bash$ wc -c < filexxx
控制终端的进程只保存了12个字符(11个字母加上一个换行), 虽然用户敲了26个按键.
在 non-canonical ("raw") 模式, 每次按键(包括特殊定义的按键, 比如
ctl-H)将会立即发送一个字符到控制进程. Bash提示符禁用了icanon和echo, 因为它用自己的更好的行编辑器代替了终端的基本行编辑器. 比如, 当你在Bash提示符下敲ctl-A的时候, 终端将不会显示 ^A, 但是Bash将会获得1字符,
然后解释这个字符, 这样光标就移动到行首了. Stéphane Chazelassetterm 设置特定的终端属性. 这个命令将向它的终端的stdout写一个字符串, 这个字符串将修改终端的行为.
bash$ setterm -cursor off
setterm 命令可以被用在脚本中来修改写到stdout的文本的外观, 虽然如果你仅仅只想完成这个目的, 还有特定的更好的工具可以用.
setterm -bold on echo bold hello
setterm -bold off echo normal hellotset 显示或初始化终端设置. 可以说这是stty的功能比较弱的版本.
bash$ tset -r
Terminal type is xterm-xfree86.
Kill is control-U (^U).
Interrupt is control-C (^C).
setserial 设置或者显示串口参数. 这个脚本只能被root用户来运行, 并且通常都在系统安装脚本中使用. # 来自于 /etc/pcmcia/serial 脚本:
IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'` setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQgetty, agetty 一个终端的初始化过程通常都是使用getty或agetty来建立, 这样才能让用户登录. 这些命令并不用在用户的shell脚本中. 它们的行为与stty很相似. mesg 使能或禁用当前用户终端的存取权限. 禁用存取权限将会阻止网络上的另一用户向这个终端写消息.当你正在编写文本文件的时候, 在文本中间突然来了一个莫名其妙的消息, 这对你来说是非常烦人的. 在多用户的网络环境下, 当你不想被打断的时候, 你可能因此希望禁用对你终端的写权限.wall 这是一个缩写单词 "write all", 也就是, 向登录到网络上的任何终端的所有用户都发送一个消息. 最早这是一个管理员的工具, 很有用, 比如, 当系统有问题的时候, 管理可以警告系统上的所有人暂时离开 (参见 Example 17-1).
bash$ wall System going down for maintenance in 5 minutes!
Broadcast message from bozo (pts/1) Sun Jul
8 13:53:27 2001...
System going down for maintenance in 5 minutes!
如果某个特定终端使用mesg来禁止了写权限, 那么wall将不会给它发消息.
信息与统计类 uname 输出系统的说明(OS, 内核版本,
等等.)到stdout.
-a 选项, 将会给出详细的信息(参见 Example 12-5). 使用-s选项只会输出OS类型.
bash$ uname -a
Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST
bash$ uname -s
Linuxarch 显示系统的硬件体系结构.
等价于 uname -m. 参见 Example 10-26. bash$ arch
bash$ uname -m
i686lastcomm 给出前一个命令的信息, 存储在/var/account/pacct文件中. 命令名字与用户名字都可以使用选项来指定. 这是GNU的一个统计工具. lastlog 列出系统上所有用户最后登录的时间. 存在/var/log/lastlog文件中.
bash$ lastlog
7 18:43:21 -
**Never logged in**
**Never logged in**
8 21:14:29 -
bash$ lastlog | grep root
7 18:43:21 -
如果用户对于/var/log/lastlog文件没有读权限的话, 那么调用这个命令就会失败.lsof 列出打开的文件. 这个命令将会把所有当前打开的文件列出一份详细的表格, 包括文件的所有者信息, 尺寸, 与它们相关的信息等等. 当然, lsof也可以管道输出到 grep 和(或)awk来分析它的结果.
bash$ lsof
30303 /sbin/init
8069 /lib/ld-2.1.3.so
8075 /lib/libc-2.1.3.so
30357 /sbin/cardmgr
strace 为了跟踪系统和信号的诊断和调试工具. 调用它最简单的方法就是strace COMMAND.
bash$ strace df
execve("/bin/df", ["df"], [/* 45 vars */]) = 0
uname({sys="Linux", node="bozo.localdomain", ...}) = 0
= 0x804f5e4
这是 Solaris truss命令的Linux的等价工具. nmap 网络端口扫描器. 这个命令将会扫描一个服务器来定位打开的端口, 并且定位这些端口相关的服务. 这是一个防止网络被黑客入侵的一个重要的安全工具. #!/bin/bash
SERVER=$HOST
# localhost.localdomain (127.0.0.1). PORT_NUMBER=25
# SMTP 端口.
nmap $SERVER | grep -w "$PORT_NUMBER"
# 这个指定端口打开了么? #
grep -w 匹配整个单词, #+
这样就不会匹配类似于1025这种含有25的端口了.
smtpnc nc(netcat)工具是一个完整的工具包, 可以使用它来连接和监听TCP和UDP端口. 它可以用来作为诊断和测试工具, 也可以用来作为基于脚本的HTTP客户端和服务器的组件.
bash$ nc localhost.localdomain 25
220 localhost.localdomain ESMTP Sendmail 8.13.1/8.13.1; Thu, 31 Mar :35 -0700
Example 13-5. Checking a remote server for identd&rojy bug&
#! /bin/sh ## Duplicate DaveG's ident-scan thingie using netcat. Oooh, he'll be p*ssed. ## Args: target port [port port port ...] ## Hose stdout _and_ stderr together. ## ##
优点: runs slower than ident-scan, giving remote inetd less cause ##+ for alarm, and only hits the few known daemon ports you specify. ##
缺点: requires numeric-only port args, the output sleazitude, ##+ and won't work for r-services when coming from high source ports. # 脚本作者: Hobbit <hobbit@avian.org> # 授权使用在本书中.
# --------------------------------------------------- E_BADARGS=65
# 至少需要两个参数. TWO_WINKS=2
# 需要睡多长时间. THREE_WINKS=3 IDPORT=113
# Authentication "tap ident" port. RAND1=999 RAND2=31337 TIMEOUT0=9 TIMEOUT1=8 TIMEOUT2=4 # ---------------------------------------------------
case "${2}" in
"" ) echo "Need HOST and at least one PORT." ; exit $E_BADARGS ;; esac
# Ping 'em once and see if they *are* running identd. nc -z -w $TIMEOUT0 "$1" $IDPORT || { echo "Oops, $1 isn't running identd." ; exit 0 ; } #
-z scans for listening daemons. #
-w $TIMEOUT = How long to try to connect.
# Generate a randomish base port. RP=`expr $$ % $RAND1 + $RAND2`
TRG="$1" shift
while test "$1" ; do
nc -v -w $TIMEOUT1 -p ${RP} "$TRG" ${1} < /dev/null > /dev/null &
sleep $THREE_WINKS
echo "${1},${RP}" | nc -w $TIMEOUT2 -r "$TRG" $IDPORT 2>&1
sleep $TWO_WINKS
# 这个脚本看起来是不是一个瘸腿脚本, 或者其它更差的什么东西? # ABS Guide 作者注释: "并不是真的那么差, #+
事实上相当清楚.&
kill -HUP $PROC
RP=`expr ${RP} + 1`
shift done
注意事项: #
尝试注释一下第30行的程序, 并且使用"localhost.localdomain 25" #+ 作为参数来运行这个脚本.
For more of Hobbit's 'nc' example scripts, #+ look in the documentation: #+ the /usr/share/doc/nc-X.XX/scripts directory.
并且, 当然, 这里还有Dr. Andrew Tridgell在BistKeeper事件中臭名卓著的一行脚本:
echo clone | nc thunk.org 5000 > e2fsprogs.dat free 使用表格形式来显示内存和缓存的使用情况. 这个命令的输出非常适合于使用
grep, awk 或者Perl来分析.
procinfo命令将会显示free命令所能显示的所有信息, 而且更多.
bash$ free
-/+ buffers/cache:
65412 显示未使用的RAM内存:
bash$ free | grep Mem | awk '{ print $4 }'
1880procinfo 从/proc pseudo-filesystem中提取和显示所有信息和统计资料. 这个命令将给出更详细的信息.
bash$ procinfo | grep Bootup
Bootup: Wed Mar 21 15:15:50 2001
Load average: 0.04 0.21 0.34 3/47 6829lsdev 显示设备, 也就是显示安装的硬件.
bash$ lsdev
------------------------------------------------
01f0-01f7 03f6-03f6
du 递归的显示(磁盘)文件的使用状况. 除非指定, 默认是当前工作目录. bash$ du -ach
./random.file
totaldf 使用列表的形式显示文件系统的使用状况. bash$ df
Filesystem
Used Available Use% Mounted on
% /usrdmesg 将所有的系统启动消息输出到stdout上. 方便出错,并且可以查出安装了哪些设备驱动和察看使用了哪些系统中断.
dmesg命令的输出当然也可以在脚本中使用 grep,
sed, 或 awk 来进行分析.
bash$ dmesg | grep hda
Kernel command line: ro root=/dev/hda2
hda: IBM-DLGA-23080, ATA DISK drive
hda: 6015744 sectors (3080 MB) w/96KiB Cache, CHS=746/128/63
hda: hda1 hda2 hda3 < hda5 hda6 hda7 > hda4
stat 显示一个或多个给定文件(也可以是目录文件或设备文件)的详细的统计信息.
bash$ stat test.cru
File: "test.cru"
Size: 49970
Allocated Blocks: 100
Filetype: Regular File
Mode: (0664/-rw-rw-r--)
501/ bozo)
501/ bozo)
Inode: 18185
Access: Sat Jun
2 16:40:24 2001
Modify: Sat Jun
2 16:40:24 2001
Change: Sat Jun
2 16:40:24 2001
如果目标文件不存在,
将会返回一个错误信息.
bash$ stat nonexistent-file
nonexistent-file: No such file or directory
vmstat 显示虚拟内存的统计信息.
bash$ vmstat
netstat 显示当前网络的统计和信息, 比如路由表和激活的连接. 这个工具存取/proc/net(第27章)中的信息. 参见 Example 27-3. netstat -r 等价于 route 命令. bash$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags
I-Node Path
/tmp/.X11-unix/X0
. . .uptime 显示系统运行的时间, 还有其他一些统计信息. bash$ uptime
load average: 0.17, 0.34, 0.27load average 如果小于或等于1, 那么就意味着系统会马上处理. 如果load average大于1, 那么就意味着进程需要排队. 如果load average大于3, 那么就意味着, 系统性能已经显著下降了.hostname 显示系统的主机名字. 这个命令在 /etc/rc.d
安装脚本(/etc/rc.d/rc.sysinit 或类似的)中设置主机名.
等价于uname
并且与$HOSTNAME内部变量很相像. bash$ hostname
localhost.localdomain
bash$ echo $HOSTNAME
localhost.localdomain 与 hostname 命令很相像的命令还有
domainname,
dnsdomainname,
nisdomainname, 和
ypdomainname 命令. 使用这些来显示或设置系统DNS 或者 NIS/YP 域名. 对于hostname命令来说使用不同的选项一样可以达到上边这些命令的目的. hostid 显示主机的32位的16进制ID.
bash$ hostid
7f0100 这个命令据说对于特定系统可以获得一个&唯一&的序号. 某些产品的注册过程可能会需要这个序号来作为用户的许可证. 不幸的是,
hostid 只会使用字节转换的方法来用16进制显示机器的网络地址. 一个没有网络的Linux机器的典型的网络地址设置在/ect/hosts中.
bash$ cat /etc/hosts
localhost.localdomain localhost
碰巧, 通过对127.0.0.1进行字节转换, 我们获得了
0.127.1.0, 用16进制表示就是007f0100, 这就是上边hostid返回的结果. 这样几乎所有的无网络的Linux机器都会得到这个hostid.sar sar (System Activity Reporter系统活动报告)
命令将会给出系统统计的一个非常详细的概要. Santa Cruz Operation("老" SCO)公司在1999年4月份以开源软件的形式发布了sar. 这个命令并不是基本Linux发行版的一部分, 但是你可以从Sebastien
Godard 写的 sysstat utilities 包中获得这个工具. bash$ sar
Linux 2.4.9 (brooks.seringas.fr)
LINUX RESTART
readelf 显示指定的 elf 格式的2进制文件的统计信息. 这个工具是binutils工具包的一部分. bash$ readelf -h /bin/bash
ELF Header:
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
2's complement, little endian
1 (current)
UNIX - System V
ABI Version:
EXEC (Executable file)
. . .size size [/path/to/binary] 命令可以显示2进制可执行文件或归档文件每部分的尺寸.
这个工具主要是程序员使用.
bash$ size /bin/bash
hex filename
82d33 /bin/bash
系统日志类 logger 附加一个用户产生的消息到系统日之中
(/var/log/messages). 不是root用户也可以调用logger.
logger Experiencing instability in network connection at 23:10, 05/21. # 现在, 运行 'tail /var/log/messages'. 通过在脚本中调用一个logger命令,
就可以将调试信息写到/var/log/messages中.
logger -t $0 -i Logging at line "$LINENO". # "-t" 选项可以为长的入口指定标签. # "-i" 选项记录进程ID.
# tail /var/log/message # ... # Jul
7 20:48:58 localhost ./test.sh[1712]: Logging at line 3. logrotate 这个工具用来管理系统的log文件, 可以在合适的时候轮换,
压缩, 删除, 和(或)e-mail它们.
这个工具将从老的log文件中取得一些杂乱的记录保存在/var/log中.
通常使用 cron 来每天运行logrotate. 在/etc/logrotate.conf中添加合适的入口就可以管理自己的log文件了, 就像管理系统log文件一样. Stefano Falsetto 创造了rottlog,
他认为这是logrotate的改进版本. 作业控制 ps 进程统计: 通过进程所有者和PID(进程ID)来列出当前执行的进程. 通常都是使用ax选项来调用这个命令, 并且结果可以通过管道传递到 grep
或 sed 中来搜索特定的进程(参见 Example 11-12 和 Example 27-2).
ps ax | grep sendmail
0:00 sendmail: accepting connections on port 25 如果想使用&树&的形式来显示系统进程:
ps afjx 或者
ps ax --forest. pgrep, pkill ps 命令与grep或kill结合使用.
bash$ ps a | grep mingetty
0:00 /sbin/mingetty tty2
0:00 /sbin/mingetty tty3
0:00 /sbin/mingetty tty4
0:00 /sbin/mingetty tty5
0:00 /sbin/mingetty tty6
4849 pts/2
0:00 grep mingetty
bash$ pgrep mingetty
2212 mingetty
2213 mingetty
2214 mingetty
2215 mingetty
2216 mingetty
pstree 使用&树&形式列出当前执行的进程. -p选项显示PID,和进程名字.
top 连续不断的显示cpu使用率最高的进程. -b 选项将会以文本方式显示, 以便于可以在脚本中分析或存取.
bash$ top -b
load average: 0.49, 0.32, 0.13
45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped
CPU states: 13.6% user,
7.3% system,
0.0% nice, 78.9% idle
78396K av,
65468K used,
12928K free,
2352K buff
157208K av,
157208K free
37244K cached
RSS SHARE STAT %CPU %MEM
TIME COMMAND
0:00 keventd
nice 使用修改后的优先级来运行一个后台作业. 优先级从19(最低)到-20(最高). 只有root用户可以设置负的(比较高的)优先级. 相关的命令是renice, snice,
和skill. nohup 保持一个命令的运行, 即使用户登出系统.
这个命令做为前台进程来运行, 除非前边加 &.
如果你在脚本中使用nohup命令, 最好和wait 命令一起使用, 这样可以避免创建一个孤儿进程或僵尸进程. pidof 取得一个正在运行的作业的进程ID(PID). 因为一些作业控制命令, 比如kill和renice只能使用进程的PID(而不是它的名字), 所以有时候必须的取得PID.
pidof命令与$PPID内部变量非常相似.
bash$ pidof xclock
Example 13-6. pidof 帮助杀掉一个进程 #!/bin/bash # kill-process.sh
NOPROCESS=2
process=xxxyyyzzz
# 使用不存在的进程. # 只不过是为了演示... # ... 并不想在这个脚本中杀掉任何真正的进程. # # 如果, 举个例子, 你想使用这个脚本来断线Internet, #
process=pppd
t=`pidof $process`
# 取得$process的pid(进程id). # 'kill'必须使用pid(不能用程序名).
if [ -z "$t" ]
# 如果没这个进程, 'pidof' 返回空. then
echo "Process $process was not running."
echo "Nothing killed."
exit $NOPROCESS fi
# 对于顽固的进程可能需要'kill -9'.
# 这里需要做一个检查, 看看进程是否允许自身被kill. # 或许另一个 " t=`pidof $process` " 或者 ...
# 整个脚本都可以使用下边这句来替换: #
kill $(pidof -x process_name) # 但是这就没有教育意义了.
exit 0fuser 取得一个正在存取某个或某些文件(或目录)的进程ID. 使用-k选项将会杀掉这些进程. 对于系统安全来说, 尤其是在脚本中想阻止未被授权的用户存取系统服务的时候, 这个命令就显得很有用了.
bash$ fuser -u /usr/bin/vim
/usr/bin/vim:
3207e(bozo)
bash$ fuser -u /dev/null
/dev/null:
3009(bozo)
3010(bozo)
3197(bozo)
3199(bozo)
当正常的插入或删除保存的媒体, 比如CD ROM或者USB闪存设备的时候, fuser的应用也显得特别重要. 有时候当你想umount一个设备失败的时候(出现设备忙的错误消息), 这意味着某些用户或进程正在存取这个设备. 使用fuser -um /dev/device_name可以搞定这些, 这样你就可以杀掉所有相关的进程.
bash$ umount /mnt/usbdrive
umount: /mnt/usbdrive: device is busy
bash$ fuser -um /dev/usbdrive
/mnt/usbdrive:
1772c(bozo)
bash$ kill -9 1772
bash$ umount /mnt/usbdrive
fuser 的-n选项可以获得正在存取某一端口的进程. 当和nmap命令组合使用的时候尤其有用.
root# nmap localhost.localdomain
STATE SERVICE
root# fuser -un tcp 25
2095(root)
root# ps ax | grep 2095 | grep -v grep
0:00 sendmail: accepting connections
cron 管理程序调度器, 执行一些日常任务, 比如清除和删除系统log文件, 或者更新slocate命令的数据库. 这是at命令的超级用户版本(虽然每个用户都可以有自己的crontab文件, 并且这个文件可以使用crontab命令来修改). 它以幽灵进程T的身份来运行, 并且从/ect/crontab中获得执行的调度入口. 一些Linux的风格都使用crond, Matthew Dillon的cron.
进程控制和启动类 init init 命令是所有进程的父进程. 在系统启动的最后一步调用,
将会依据/etc/inittab来决定系统的运行级别. 只能使用root身份来运行它的别名telinit. telinit init命令的符号链接, 这是一种修改系统运行级别的一个手段,
通常在系统维护或者紧急的文件系统修复的时候才用. 只能使用root身份调用. 调用这个命令是非常危险的 - 在你使用之前确定你已经很好地了解它. runlevel 显示当前和最后的运行级别, 也就是, 确定你的系统是否终止(runlevel 为0), 还是运行在单用户模式(1), 多用户模式(2), 或者是运行在X Windows(5), 还是正在重启(6). 这个命令将会存取/var/run/utmp文件. halt, shutdown, reboot 设置系统关机的命令, 通常比电源关机的优先级高. service 开启或停止一个系统服务.
启动脚本在/etc/init.d中, 并且/etc/rc.d在系统启动的时候使用这个命令来启动服务.
root# /sbin/service iptables stop
Flushing firewall rules:
Setting chains to policy ACCEPT: filter
Unloading iptables modules:
网络类 ifconfig 网络的接口配置和调试工具.
bash$ ifconfig -a
Link encap:Local Loopback
inet addr:127.0.0.1
Mask:255.0.0.0
UP LOOPBACK RUNNING
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:700 (700.0 b)
TX bytes:700 (700.0 b) ifconfig 命令绝大多数情况都是在启动时候设置接口, 或者在重启的时候关闭它们.
# 来自于 /etc/rc.d/init.d/network 的代码片段
# 检查网络是否启动. [ ${NETWORKING} = "no" ] && exit 0
[ -x /sbin/ifconfig ] || exit 0
for i in $ do
if ifconfig $i 2>/dev/null | grep -q "UP" >/dev/null 2>&1 ; then
action "Shutting down interface $i: " ./ifdown $i boot
fi # grep命令的GNU指定的 "-q" 的意思是&安静&, 也就是不产生输出. # 这样, 后边重定向到/dev/null的操作就有点重复了.
echo "Currently active devices:" echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'` #
应该被引用防止globbing. #
下边这段也能工作. #
echo $(/sbin/ifconfig | awk '/^[a-z]/ { print $1 })' #
echo $(/sbin/ifconfig | sed -e 's/ .*//') #
Thanks, S.C.做了额外的注释. 参见 Example 29-6. iwconfig 这是为了配置无线网络的命令集合.
可以说是上边的ifconfig的无线版本. route 显示内核路由表信息, 或者查看内核路由表的修改.
bash$ route
Destination
MSS Window
irtt Iface
pm3-67.bozosisp *
255.255.255.255 UH
pm3-67.bozosisp 0.0.0.0
chkconfig 检查网络配置. 这个命令负责显示和管理在启动过程中所开启的网络服务(这些服务都是从/etc/rc?.d目录中开启的). 最开始是从IRIX到Red Hat Linux的一个接口,
chkconfig在某些Linux发行版中并不是核心安装的一部分.
bash$ chkconfig --list
tcpdump 网络包的&嗅探器&. 这是一个用来分析和调试网络上传输情况的工具, 它所使用的手段是把匹配指定规则的包头都显示出来. 显示主机bozoville和主机caduceus之间所有传输的ip包.
bash$ tcpdump ip host bozoville and caduceus
当然,tcpdump的输出可以被分析, 可以用我们之前讨论的文本处理工具来分析结果.
文件系统类 mount 加载一个文件系统, 通常都用来安装外部设备, 比如软盘或CDROM. 文件/etc/fstab 将会提供一个方便的列表, 这个列表列出了所有可用的文件系统, 分区和设备, 另外还包括某些选项, 比如是否可以自动或者手动的mount. 文件/etc/mtab 显示了当前已经mount的文件系统和分区(包括虚拟的, 比如/proc). mount -a 将会mount所有列在/ect/fstab中的文件系统和分区, 除了那些标记有非自动选项的. 在启动的时候, 在/etc/rc.d中的一个启动脚本(rc.sysinit或者一些相似的脚本)将会这么调用, mount所有可用的文件系统和分区.
mount -t iso9660 /dev/cdrom /mnt/cdrom # 加载 CDROM mount /mnt/cdrom # 方便的方法, 如果 /mnt/cdrom 包含在 /etc/fstab 中
这个多功能的命令甚至可以将一个普通文件mount到块设备中, 并且这个文件就好像一个文件系统一样.
mount可以将文件与一个loopback设备相关联来达到这个目的.ccomplishes that by
associating the file with a loopback
device. 这种应用通常都是用来mount和检查一个ISO9660镜像,在这个镜像被烧录到CDR之前.
Example 13-7. 检查一个CD镜像 # 以root身份...
mkdir /mnt/cdtest
# 如果没有的话,准备一个mount点.
mount -r -t iso9660 -o loop cd-image.iso /mnt/cdtest
# mount这个镜像. #
"-o loop" option equivalent to "losetup /dev/loop0" cd /mnt/cdtest
# 现在检查这个镜像. ls -alR
# 列出目录树中的文件.
# 等等.umount 卸除一个当前已经mount的文件系统. 在正常删除之前已经mount的软盘和CDROM之前, 这个设备必须被unmount, 否则文件系统将会损坏.
umount /mnt/cdrom # 现在你可以按下退出按钮(指的是cdrom或软盘驱动器上的退出钮), 并安全的退出光盘.automount工具, 如果适当的安装, 当需要存取或退出磁盘或软盘的时候, 就可自动的mount和unmount它们. 但是在带有软盘和光驱的笔记本电脑上, 这可能会引起问题.sync 强制写入所有需要更新的buffer上的数据到硬盘上(同步带有buffer的驱动器). 如果不是严格必要的话,一个sync就可以保证系统管理员或者用户刚刚修改的数据会安全的在突然的断点中幸存下来. 在比较早以前, 在系统重启前都是使用
sync (两次, 这样保证绝对可靠), 这是一种很有用的小心的方法. 有时候, 比如当你想安全删除一个文件的时候(参见 Example 12-55), 或者当磁盘灯开始闪烁的时候, 你可能需要强制马上进行buffer刷新. losetup 建立和配置loopback设备. Example 13-8. 在一个文件中创建文件系统 SIZE=1000000
head -c $SIZE < /dev/zero > file
# 建立指定尺寸的文件. losetup /dev/loop0 file
# 作为loopback设备来建立. mke2fs /dev/loop0
# 创建文件系统. mount -o loop /dev/loop0 /mnt
# Mount它.
# Thanks, S.C.mkswap 创建一个交换分区或文件. 交换区域随后必须马上使用swapon来使能. swapon, swapoff 使能/禁用 交换分区或文件.
这两个命令通常在启动和关机的时候才有效. mke2fs 创建Linux ext2 文件系统. 这个命令必须以root身份调用. Example 13-9. 添加一个新的硬盘驱动器 #!/bin/bash
# 在系统上添加第二块硬盘驱动器. # 软件配置. 假设硬件已经安装了. # 来自于本书作者的一篇文章. # 在"Linux Gazette"的问题#38上, .
ROOT_UID=0
# 这个脚本必须以root身份运行. E_NOTROOT=67
# 非root用户将会产生这个错误.
if [ "$UID" -ne "$ROOT_UID" ] then
echo "Must be root to run this script."
exit $E_NOTROOT fi
# 要非常谨慎的小心使用! # 如果某步错了, 可能会彻底摧毁你当前的文件系统.
NEWDISK=/dev/hdb
# 假设/dev/hdb空白. 检查一下! MOUNTPOINT=/mnt/newdisk
# 或者选择另外的mount点.
fdisk $NEWDISK mke2fs -cv $NEWDISK1
# 检查坏块, 详细输出. #
/dev/hdb1, *不是* /dev/hdb! mkdir $MOUNTPOINT chmod 777 $MOUNTPOINT
# 让所有用户都具有全部权限.
# 现在, 测试一下... # mount -t ext2 /dev/hdb1 /mnt/newdisk # 尝试创建一个目录. # 如果工作起来了, umount它, 然后继续.
# 最后一步: # 将下边这行添加到/etc/fstab. # /dev/hdb1
/mnt/newdisk
exit 0 参见 Example 13-8 和 Example 28-3. tune2fs 调整ext2文件系统. 可以用来修改文件系统参数, 比如mount的最大数量. 必须以root身份调用.这是一个非常危险的命令. 如果坏了, 你需要自己负责, 因为它可能会破坏你的文件系统.dumpe2fs 打印(输出到stdout上)非常详细的文件系统信息. 必须以root身份调用. root# dumpe2fs /dev/hda7 | grep 'ount count'
dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09
Mount count:
Maximum mount count:
20hdparm 列出或修改硬盘参数. 这个命令必须以root身份调用, 如果滥用的话会有危险. fdisk 在存储设备上(通常都是硬盘)创建和修改一个分区表. 必须以root身份使用.谨慎使用这个命令. 如果出错, 会破坏你现存的文件系统.fsck, e2fsck, debugfs 文件系统的检查, 修复, 和除错命令集合. fsck: 检查UNIX文件系统的前端工具(也可以调用其它的工具). 文件系统的类型一般都是默认的ext2. e2fsck: ext2文件系统检查器. debugfs: ext2文件系统除错器.
这个多功能但是危险的工具的用处之一就是(尝试)恢复删除的文件. 只有高级用户才能用.上边的这几个命令都必须以root身份调用, 这些命令都很危险, 如果滥用的话会破坏文件系统.badblocks 检查存储设备的坏块(物理损坏).
这个命令在格式化新安装的硬盘时或者测试备份的完整性的时候会被用到.
举个例子, badblocks /dev/fd0
测试一个软盘. badblocks可能会引起比较糟糕的结果(覆盖所有数据), 在只读模式下就不会发生这种情况. 如果root用户拥有需要测试的设备(通常都是这种情况), 那么root用户必须调用这个命令. lsusb, usbmodules lsusb 命令会列出所有USB(Universal Serial Bus通用串行总线)总线和使用USB的设备. usbmodules 命令会输出连接USB设备的驱动模块的信息.
root# lsusb
Bus 001 Device 001: ID
Device Descriptor:
bDescriptorType
bDeviceClass
bDeviceSubClass
bDeviceProtocol
bMaxPacketSize0
mkbootdisk 创建启动软盘, 启动盘可以唤醒系统, 比如当MBR(master boot record主启动记录)坏掉的时候. mkbootdisk 命令其实是一个Bash脚本, 由Erik Troan所编写, 放在/sbin目录中. chroot 修改ROOT目录. 一般的命令都是从$PATH中获得的, 相对的默认的根目录是 /. 这个命令将会把根目录修改为另一个目录(并且也将把工作目录修改到那).
出于安全目的, 这个命令时非常有用的, 举个例子, 当系统管理员希望限制一些特定的用户, 比如telnet上来的用户, 将他们限定到文件系统上一个安全的地方(这有时候被称为将一个guest用户限制在&chroot 监牢&中). 注意, 在使用chroot之后, 系统的二进制可执行文件的目录将不再可用了. chroot /opt 将会使得原来的/usr/bin目录变为/opt/usr/bin. 同样,
chroot /aaa/bbb /bin/ls 将会使得ls命令以/aaa/bbb作为根目录, 而不是以前的/. 如果使用alias XX 'chroot /aaa/bbb
ls', 并把这句放到用户的~/.bashrc文件中的话, 这将可以有效地限制运行命令&XX&时, 命令&XX&可以使用文件系统的范围. 当从启动盘恢复的时候(chroot 到 /dev/fd0), 或者当系统从死机状态恢复过来并作为进入lilo的选择手段的时候, chroot命令都是非常方便的. 其它的应用还包括从不同的文件系统进行安装(一个rpm选项)或者从CDROM上运行一个只读文件系统.
只能以root身份调用, 小心使用.由于正常的$PATH将不再被关联了, 所以可能需要将一些特定的系统文件拷贝到chrooted目录中.lockfile 这个工具是procmail包的一部分(www.procmail.org).
它可以创建一个锁定文件, 锁定文件是一种用来控制存取文件, 设备或资源的标记文件. 锁定文件就像一个标记一样被使用, 如果特定的文件, 设备, 或资源正在被一个特定的进程所使用(&busy&), 那么对于其它进程来说, 就只能受限进行存取(或者不能存取).
lockfile /home/bozo/lockfiles/$0.lock # 创建一个以脚本名字为前缀的写保护锁定文件. 锁定文件用在一些特定的场合, 比如说保护系统的mail目录以防止多个用户同时修改, 或者提示一个modem端口正在被存取, 或者显示Netscape的一个实例正在使用它的缓存. 脚本可以做一些检查工作, 比如说一个特定的进程可以创建一个锁定文件, 那么只要检查这个特定的进程是否在运行, 就可以判断出锁定文件是否存在了. 注意如果脚本尝试创建一个已经存在的锁定文件的话, 那么脚本很可能被挂起. 一般情况下, 应用创建或检查锁定文件都放在/var/lock目录中.
脚本可以使用下面的方法来检测锁定文件是否存在.
appname=xyzip # 应用 "xyzip" 创建锁定文件 "/var/lock/xyzip.lock".
if [ -e "/var/lock/$appname.lock" ] then
... flock&rojy bug&
flock命令比lockfile命令用得少得多.Much less useful than the lockfile
command is flock. It sets an
"advisory" lock on a file and then executes
a command while the lock is on. This is to prevent
any other process from setting a lock on that file until
completion of the specified command. flock $0 cat $0 > lockfile__$0 #
Set a lock on the script the above line appears in, #+ while listing the script to stdout.与lockfile不同,
flock不会自动创建一个锁定文件.mknod 创建块或者字符设备文件(当在系统上安装新硬盘时可能是必要的). MAKEDEV工具事实上具有nknod的全部功能, 而且更容易使用. MAKEDEV 创建设备文件的工具. 必须在/dev目录下, 并且以root身份使用.
root# ./MAKEDEV
这是mknod的高级版本.tmpwatch 自动删除在指定时间内未被存取过的文件. 通常都是被cron调用, 用来删掉老的log文件.
备份类 dump, restore dump 命令是一个精巧的文件系统备份工具, 通常都用在比较大的安装和网络上.
它读取原始的磁盘分区并且以二进制形式来写备份文件.
需要备份的文件可以保存到各种各样的存储设备上, 包括磁盘和磁带. restore命令用来恢复dump所产生的备份. fdformat 对软盘进行低级格式化.
系统资源类 ulimit 设置使用系统资源的上限. 通常情况下都是使用-f选项来调用, -f用来设置文件尺寸的限制(ulimit -f 1000就是将文件大小限制为1M).
-c(译者注: 这里应该是作者笔误, 作者写的是-t)选项来限制coredump(译者注:
核心转储, 程序崩溃时的内存状态写入文件)尺寸(ulimit -c 0 就是不要coredumps).
一般情况下, ulimit的值应该设置在/etc/profile 和(或)~/.bash_profile中(参见 Appendix G). Judicious 使用ulimit 可以保护系统免受可怕的fork炸弹的迫害.
#!/bin/bash # 这个脚本只是为了展示用. # 你要自己为运行这个脚本的后果负责 -- 它*将*凝固你的系统.
while true
死循环. do
这个脚本调用自身 . . .
#+ fork无限次 . . .
#+ 直道系统完全不动, 因为所有的资源都耗尽了. done
这就是臭名卓著的 "sorcerer's appentice" 剧情.&rojy bug&(译者注:巫师的厢房?没看懂)
这里不会真正的推出, 因为这个脚本不会终止.
当这个脚本超过预先设置的限制时, 在/etc/profile中的 ulimit -Hu XX (XX 就是需要限制的用户进程) 可以终止这个脚本的运行.quota 显示用户或组的磁盘配额. setquota 从命令行中设置用户或组的磁盘配额. umask 设定用户创建文件时权限的缺省mask(掩码). 也可以用来限制特定用户的默认文件属性.
所有用户创建的文件属性都是由umask所指定的. The (octal) 传递给umask的8进制的值定义了文件的权限. 比如, umask
022将会使得新文件的权限最多为755(777 与非 022)
当然, 用户可以随后使用chmod来修改指定文件的属性. 用户一般都是将umask设置值的地方放在/etc/profile 和(或)
~/.bash_profile中 (参见 Appendix G). Example 13-10. 使用umask来将输出文件隐藏起来 #!/bin/bash # rot13a.sh: 与"rot13.sh"脚本相同, 但是会将输出写道&安全&文件中.
# 用法: ./rot13a.sh filename # 或
./rot13a.sh <filename # 或
./rot13a.sh 同时提供键盘输入(stdin)
文件创建掩码.
被这个脚本所创建的文件
#+ 将具有600权限.
OUTFILE=decrypted.txt
结果保存在"decrypted.txt"中
#+ 这个文件只能够被
这个脚本的调用者(or root)所读写.
cat "$@" | tr 'a-zA-Z' 'n-za-mN-ZA-M' > $OUTFILE #
^^ 从stdin 或文件中输入.
^^^^^^^^^^ 输出重定向到文件中.
exit 0rdev 取得root device, swap space, 或 video
mode的相关信息, 或者对它们进行修改.
通常说来rdev都是被lilo所使用, 但是在建立一个ram disk的时候, 这个命令也很有用. 小心使用, 这是一个危险的命令.
模块类 lsmod 列出所有安装的内核模块.
bash$ lsmod
2 (autoclean)
0 (unused)
0 [opl3 sb uart401]
6 [sb sound]
2 [serial_cs]
pcmcia_core
0 [serial_cs ds i82365]
使用cat /proc/modules可以得到同样的结果.insmod 强制一个内核模块的安装(如果可能的话, 使用modprobe来代替) 必须以root身份调用. rmmod 强制卸载一个内核模块. 必须以root身份调用. modprobe 模块装载器, 一般情况下都是在启动脚本中自动调用. 必须以root身份调用. depmod 创建模块依赖文件, 一般都是在启动脚本中调用. modinfo 输出一个可装载模块的信息. bash$ modinfo hid
/lib/modules/2.4.20-6/kernel/drivers/usb/hid.o
description: "USB HID support drivers"
"Andreas Gal, Vojtech Pavlik <vojtech@suse.cz>"
杂项类 env 使用设置过的或修改过(并不是修改整个系统环境)的环境变量来运行一个程序或脚本. 使用 [varname=xxx]
形式可以在脚本中修改环境变量. 如果没有指定参数, 那么这个命令将会列出所有设置的环境变量.在Bash和其它的Bourne shell 衍生物中, 是可以在单一命令行上设置多个变量的.
var1=value1 var2=value2 commandXXX # $var1 和 $var2 只设置在'commandXXX'的环境中. 当不知道shell或解释器的路径的时候, 脚本的第一行(#!行)可以使用env.
#! /usr/bin/env perl
print "This Perl script will run,n"; print "even when I don't know where to find Perl.n";
# 便于跨平台移植, # Perl程序可能没在期望的地方. # Thanks, S.C. ldd 显示一个可执行文件的共享库的依赖关系.
bash$ ldd /bin/ls
libc.so.6 => /lib/libc.so.6 (0x)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x)watch 以指定的时间间隔来重复运行一个命令. 默认的时间间隔是2秒, 但时刻以使用-n选项来修改.
watch -n 5 tail /var/log/messages # 每隔5秒钟显示系统log文件的结尾, /var/log/messages.strip 从可执行文件中去掉调试符号引用. 这样做可以减小尺寸, 但是就不能调试了. 这个命令一般都用在Makefile中,
但是很少用在shell脚本中. nm 列出未strip过的编译后的2进制文件的符号. rdist
远程文件分布客户机程序: 在远端服务器上同步, 克隆, 或者备份一个文件系统.
利用我们所学到的关于管理命令的知识, 让我们一起来练习分析一个系统脚本. 最简单并且最短的系统脚本之一是killall, 这个脚本被用来在系统关机时挂起运行的脚本.
Example 13-11. killall, 来自于 /etc/rc.d/init.d
# --> 本书作者所作的注释全部以"# -->"开头.
# --> 这是由Miquel van Smoorenburg所编写的 # --> 'rc'脚本包的一部分, <miquels@drinkel.nl.mugnet.org>.
# --> 这个特殊的脚本看起来是是为Red Hat / FC所特定的, # --> (在其它的发行版中可能不会出现).
停止所有正在运行的不必要的服务 #+ (there shouldn't be any, so this is just a sanity check)
for i in /var/lock/subsys/*; do
# --> 标准的for/in循环, 但是由于"do"在同一行上,
# --> 所以必须添加";".
# 检查脚本是否在那.
[ ! -f $i ] && continue
# --> 这是一种使用&与列表&的聪明的方法, 等价于:
# --> if [ ! -f "$i" ]; then continue
# 取得子系统的名字.
subsys=${i#/var/lock/subsys/}
# --> 匹配变量名, 在这里就是文件名.
# --> 与subsys=`basename $i`完全等价.
从锁定文件名中获得
# -->+ (如果那里有锁定文件的话,
# -->+ 那就证明进程正在运行).
参考一下上边所讲的&锁定文件&的内容.
# 终止子系统.
if [ -f /etc/rc.d/init.d/$subsys.init ]; then
/etc/rc.d/init.d/$subsys.init stop
/etc/rc.d/init.d/$subsys stop
挂起运行的作业和幽灵进程.
注意"stop"只是一个位置参数,
# -->+ 并不是shell内建命令.
fi done 这个没有那么糟. 除了在变量匹配的地方玩了一点花样, 其它也没有别的材料了. 练习 1. 在/etc/rc.d/init.d中,
分析halt脚本. 比脚本killall长一些, 但是概念上很相近. 对这个脚本做一个拷贝, 放到你的home目录下并且用它练习一下(不要以root身份运行它). 使用-vn标志来模拟运行一下(sh -vn scriptname). 添加详细的注释. 将"action"命令修改为"echos".
练习 2. 察看/etc/rc.d/init.d下的更多更复杂的脚本. 看看你是不是能够理解其中的一些脚本. 使用上边的过程来分析这些脚本. 为了更详细的理解, 你可能也需要分析在usr/share/doc/initscripts-?.??目录下的文件sysvinitfile,
这些都是&initscript&文件的一部分.
感谢关注 Ithao123Shell基础教程频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊

我要回帖

更多关于 indesign怎么设置母版 的文章

 

随机推荐