fedora23和centos7+ 都是使用的 systemd 来代替sysv 管理系统启动和服务了. 在systemd 中主要包含两个方面的内容,
当打开/etc/inittab 文件时, 会看到:
inittab is no longer used,
Adding configuration here will have no effect on system.
systemd uses 'targets' instead of runlevels. By default, there are two main targets:
multi-user.target: analogous to runlevel 3
graphical.target: analogous to runlevel 5
To view current default target, run:systemctl get-default
To set a default target, runsystemctl set-default TARGET.target
一个是系统服务service, 像很多的 系统服务包括httpd.service等都是放在 systemd/system下的;
另一个就是 系统的启动管理.包括原来的 /etc/inittab, runlevels 等 都是由 systemd/system/下的target 来管理的了.
target 被设计成层级结构,逐级包含和require. 比如: multi-user.target就类似于原来的 runlevel3 它包含 basic.target. 而graphical.target就类似于(analogous to)原来的runlevel5. 它又包含 multi-user.target.每个target都有对应的需求启动项,包含在对应的 *.target.wants(wants 就是对应的目标所需要的内容...)
在每个target中, 的内容是: 规定了前提条件: requisite, 先于当前target 启动的服务Before=...,当前服务启动后, 然后还要启动的服务 After=...
[foo@localhost system]$ ls *.wants ## 查看各个目标需要的wants, 每个wants下列出了需要的哪些服务. systemd就是这样来管理系统启动的
anaconda.target.wants:
anaconda-nm-config.service anaconda-tmux@tty2.service
# basic.target.wants:
alsa-restore.service alsa-state.service fedora-autorelabel-mark.service fedora-autorelabel.service fedora-loadmodules.service
busnames.target.wants:
org.freedesktop.hostname1.busname org.freedesktop.login1.busname org.freedesktop.resolve1.busname
org.freedesktop.import1.busname org.freedesktop.machine1.busname org.freedesktop.systemd1.busname
org.freedesktop.locale1.busname org.freedesktop.network1.busname org.freedesktop.timedate1.busname
dbus.target.wants:
default.target.wants:
# graphic.target包含(requires multi-user.target, multi-user.target又requires basic.target)
graphical.target.wants:
systemd-update-utmp-runlevel.service
# multi-user.target需要的wants.
multi-user.target.wants:
dbus.service plymouth-quit.service systemd-ask-password-wall.path systemd-update-utmp-runlevel.service
getty.target plymouth-quit-wait.service systemd-logind.service systemd-user-sessions.service
在 markdown中, 如果有多个回车换行, 至少是可以认识一个 换行的, 即可以显示 一个空行的, 但是多个空行(回车换行)无效
在 显示/过滤 符合 条件的 多个目录时, 可以使用 -d (--directory) 选项,将只显示 目录本身, 而不显示内容. 这个将很有用. show directroies themselves not their contents.
在 /usr/lib/systemd/system下, default.target 是一个指向 默认启动的target的 软链接. 这个就是供 systemd的管理工具 systemctl 来获得默认启动 级别的 get-default.
在bash中, 要将多行字符串 重定向输出到 文件中, 使用下面的格式
[foo@localhost ~]$ cat > 重定向文件名.txt <<eof
> [daemon]
> autologinEnabled = true
> autologinUser = liveuser
> eof (如果是在脚本中, 就没有前面的大于符号)
但是在 /usr/lib/systemd/system 下的 basic.target.wants, multi-user.target.wants, graphical.target.wans中都没有发现syslog, 它们里面只有一些 需要的service服务. 而且在 /etc/rc5.d中也没用 什么 S20syslog 文件?
在 /usr/include/中是一些linux系统要使用的 头文件. 其中一些 数据结构本身的 定义 放在 /usr/include/bits 目录中,
- 而 操作这些数据结构的同名文件 放在 /usr/include中,
- 比如: 存储当前登录用户信息的文件 有: /var/log/btmp 和 存储以往登录过的用户的信息文件 /var/log/wtmp (这两个文件是数据库文件, 非ascii文件,不可读) . 这两个文件使用的 基本的数据结构就是 一个结构体 struct utmp() . 参考: http://blog.chinaunix.net/uid-25909722-id-2851379.html
- 关于utmp这个结构体的具体定义是放在 /usr/include/bits/utmp.h文件中的.
- 而关于结构体 utmp的操作的函数, 比如 getutmp, setutent等 是放在 /usr/include/ utmp.h文件中的.
- 根据这个结构体的一些信息和操作函数, 就可以 自己写成 类似于 linux的 who命令的 用户信息输出的 自定义命令程序等..
关于utmp, wtmp, btmp?
utmp maintains a full accounting of the current status of the system, system boot time (used by uptime), recording user logins at which terminals, logouts, system events etc.
wtmp acts as a historical utmp
btmp records failed login attempts
The utmp file is not a text file, but rather a binary format which needs to be edited by specially crafted programs.
原来, 从fedora20开始, 就没有 使用 /var/log/messages 了, 而是使用的 journalctrl 来代替 messages了, 参考: http://blog.163.com/shishihoule@126/blog/static/5729354720142204418292/
- 所以 就没有 syslogd, rsyslogd, ksyslogd, 如同上面所说的那样, 在 /etc/rc5.d目录中 也没有 S20syslog 文件了.
- 就是: 原来的 显示messages 的命令 "cat /var/log/messages" 命令直接使用 一个单词, journalctl 来显示了,
- 其他的相关命令 使用 journalctl -f 递增查看. 和 过滤 : journal | grep 'foo'
要保存 fedora的 gnome的 会话, 使得下一次启动时也能 恢复本次的 窗口和状态, 方法是: 使用 dconf-editor 可是化界面设置, 或者使用 命令:
gsettings set org.gnome.SessionManager auto-save-session true
只能恢复第一个 workspace中的 内容 因此, 如果你想 下次开机时, 还是有这些内容,
可以把他们都放在第一个workspace中,
namespace 指的是所在的目录,是位置
而use 是指的使用的类文件,是文件
控制器的类名应该是:Foo + Controller:FooController 而不只是单单的class Foo. 你是继承自Controller的,那自然你也应该是 xxxController才行。
关于apache中的module模块的名称
- 有三个地方使用到了模块的名称,其中只有在httpd.conf中的
# LoadModule rewrite_module
LoadModule后面的模块名称使用的是 ModuleName_module 外, 其他地方都是使用 的 mod_modulename, 比如:
LoadModule rewrite_module modules/mod_rewrite.so
httpd.conf中: <IfModule mod_rewrite> .... </IfModule>
thinkphp中的.htaccess 配置中: <IfModule mod_rewrite.c> ... <IfModule>
要实现/开启 地址重写, 除了 'URL_MODEL' => 2外, 还要 给 apache启用 /开启 LoadModule rewrite_module, 否则重写地址不生效.
注意区分 apache 和 php的 插件机制的不同, apache叫 modules, 名称是:xxx_module. 比如rewrite_module modules/mod_rewrite.so 而 php叫做扩展extensions. 名称是: php_xxx, 比如 php_mysql, php_mysqli等等.
apache的模块是放在 Apache 目录的 modules文件夹中的, 模块的路径也是以 Apache目录为相对路径的. 所以 LoadModule rewrite_module modules/mod_rewrite.so 的目录就是直接从 modules开始写起的.
经过实践验证, 确实是, URL_MODEL 既可以放在应用配置文件中, 这时所有的模块都使用相同的url模式, 也可以放在 模块配置文件中, 那么就只有这一个模块 使用 你配置的url模式.
要使用URL 模式为重写模式, 要求 .htaccess要和 入口文件index.php放在同一位置. 同一个目录下才行. 当然 的, rewrite的作用就不 只是 省略入口文件
.htaccess文件
是用来 影响 你要设置的某个目录的, 所以, 如果你要处理某个目录, 不一定是 Application/目录, 就要在对应的目录下 创建 相应的 .htaccess文件, 这个.ht..文件可以有多个
关于rewrite重写的规则问题:
- 重写规则中,不能以斜杠/ 开始, 默认的重写只是对
http://servername/
后面的内容才重写, 对servername/ 总是不重写不管的. - 如果url_mode=2 只重写斜杠的部分, 对问号后面的 query_string 不管.
也可以自己写 重写规则, 不一定只是 那个 省略index.php的重写规则 比如下面的规则就是 将 cool的访问 重写/重定向到bar的操作action
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^Home/Foo/cool$ index.php/Home/Foo/bar [QSA,PT,L]
# 默认的重写规则是: RewriteRule ^.*$ index.php/$1 [QSA,PT,L]
当访问如下的url地址时,
http://localhost/Home/Foo/cool?val=3
获得的 dump($_SERVER) 的输出:
array
'REDIRECT_STATUS' => string '200' (length=3)
'HTTP_HOST' => string 'localhost' (length=9)
'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0' (length=65)
'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
'HTTP_ACCEPT_LANGUAGE' => string 'en-US,en;q=0.5' (length=14)
'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate' (length=13)
'HTTP_COOKIE' => string 'PHPSESSID=ufujblmd3tnp9ch7lsao4ov594; pgv_pvi=8625812480; pgv_si=s4041340928' (length=76)
'HTTP_CONNECTION' => string 'keep-alive' (length=10)
'PATH' => string 'C:\Program Files\Intel\iCLS Client\;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Windows Live\Shared;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;' (length=363)
'SystemRoot' => string 'C:\Windows' (length=10)
'COMSPEC' => string 'C:\Windows\system32\cmd.exe' (length=27)
'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC' (length=53)
'WINDIR' => string 'C:\Windows' (length=10)
'SERVER_SIGNATURE' => string '' (length=0)
'SERVER_SOFTWARE' => string 'Apache/2.2.17 (Win32) PHP/5.3.5' (length=31)
'SERVER_NAME' => string 'localhost' (length=9)
'SERVER_ADDR' => string '127.0.0.1' (length=9)
'SERVER_PORT' => string '80' (length=2)
'REMOTE_ADDR' => string '127.0.0.1' (length=9)
'DOCUMENT_ROOT' => string 'C:/wamp/www/' (length=12)
'SERVER_ADMIN' => string 'admin@localhost' (length=15)
'SCRIPT_FILENAME' => string 'C:/wamp/www/index.php' (length=21)
'REMOTE_PORT' => string '53416' (length=5)
'REDIRECT_QUERY_STRING' => string 'val=3' (length=5)
'REDIRECT_URL' => string '/Home/Foo/cool' (length=14)
'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
'REQUEST_METHOD' => string 'GET' (length=3)
'QUERY_STRING' => string 'val=3' (length=5) // 不管是query,还是 request等, 都没有ing
'REQUEST_URI' => string '/Home/Foo/cool?val=3' (length=20) // REQUEST_URI 是最真是/最直接的 请求地址, 就是跟浏览器的地址栏中的内容完全一样.
'SCRIPT_NAME' => string '/index.php' (length=10) // 会显示 真实的 脚本名称,在 servername后面的 脚本名称, 如这里的 /index.php
'PATH_INFO' => string 'Foo/bar' (length=7) // PATH_INFO 包含的是: 控制器/操作: Controller/Action
'PATH_TRANSLATED' => string 'C:\wamp\www\Home\Foo\bar' (length=24)
'PHP_SELF' => string '/index.php/Home/Foo/bar' (length=23) 是用来 和 REQUEST_URI 区分查询字符串的, 是 REQUEST_URI去掉查询字符串后的内容.
'REQUEST_TIME' => int 1516797830
在 win中 , php的函数名和变量要区分大小写? 而关键字和结构词汇不区分大小写吗?
通常来说, 只有 变量(及其 变量数组的 下标) 是在win下 严格区分大小写的. 而其他都不分大小写.
但是 , 在 linux下, 一切 都是区分 大小写的 , 一切都是 case sensitive的.
所以 养成一个习惯, 不管是在 哪种平台下, 不管是win, 还是 linux下, 都要养成 区分大小写的习惯.
也就是 只有变量 才会 区分大小写. 而其他任何的 关键字 如echo, 结构语法如if, If ELSe等, 常量等如__File__ 都不会区分大小写.
=======================
<IfModule [!] module_file | module_name >... </IfModule>
格式中, ifmodule是指, 判断所指定的 模块 是否指定/是否 启用/是否生效 来决定是否启用中间的代码段. 其中, 可以使用 否定的 符号!, 后面的条件可以用 编译模块时的文件名, 也可以指定 模块名称, 所以, <IfModule mod_rewrite.c 或者 mod_rewrite
都是可以的.
在linux下, httpd的 module 模块插件, 是放在 /usr/lib/httpd/modules这个目录下的, 配置文件中的 mod_路径也是以 这个目录下 为相对路径的: LoadModule rewrite_module modules/mod_rewrite.so