[转] Linux 查看和修改时区

转自:http://imshuai.com/change-linux-timezone/ 感觉写的不错,清晰明了。

对于部署在海外的Linux服务器来说,拿到的机器时区和本地并不一样,导致运行在上面的应用也面临时区问题。所以有必要修改系统本地时区。

1. 查看时区

查看当前生效的时区,可以简单的通过date命令查看当前时间:

[root@shuai01 zoneinfo]# date -R
Tue, 17 Jan 2017 21:36:23 +0800
最后的 +0800,即东 8 区。

2. 设置时区

然并卵的 tzselect 命令

看起来很像一个时区选择的工具,但并非如此。事实上 tzselect 仅仅是一个查看时区表示方式的『向导』程序而已。通过依次询问大洲u2192国家u2192城市,最后告诉你如何TZ变量的写法,比如北京时间是:Asia/Shanghai

TZ变量

可以通过修改 TZ 变量,直接修改时区信息,比如:

[root@shuai01 ~]# date -R
Tue, 17 Jan 2017 13:57:06 +0000
[root@shuai01 ~]# export  TZ='Asia/Urumqi'
[root@shuai01 ~]# date -R
Tue, 17 Jan 2017 19:57:18 +0600

有 Linux 经验的小伙伴都知道,不写在文件里的设置更改很难生效一般是会话级的,重新登录会消失。所以,这样直接修改 TZ 的尿性绝对做不到持久化更改时区的。

正确的方式是到 /etc/profile 里(或用户的 .profile 或 .bashrc 文件),直接 export TZ 变量为要更改的时区(时区的名字可以用 tzselect 向导来确定)

/etc/localtime 文件

默认情况下情况下,TZ 属性是空,这时候是靠 /etc/localtime 文件来确定的时区。而此文件通常又是一个到 /usr/share/zoneinfo/ 下各种时区文件的软连接。通过修改 /etc/localtime 指向的软连接,进而修改系统的时区。比如下面的方法,将 localtime 文件设置为了北京时间:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3. 总结

tzselect 命令无法修改时区,仅给出时区的城市表示法
TZ变量和 /etc/localtime 文件会影响时区,并建议直接修改 /etc/localtime 文件。
如果在 shell 中临时需要变更时区信息,可以修改 TZ 变量实现。
在 profile 文件里设置变量 TZ,达到和修改 /etc/localtime 类似的效果。

更新

2017-01-19
设置完时区,最好做一次服务器重启(或相关service的重启)。否则像crontab这样的服务,会仍然沿用原来的时区。

关闭 vim 默认的 visual 模式

比较新的 Debian 系统中内置的 vim 也比较新,vim 有个默认的配置文件位于/usr/share/vim/vim80/defaults.vim,如果没有设置 $HOME/.vimrc 的话,vim 就会读取这个配置文件。

这个配置文件里有一项配置

if has('mouse')
  set mouse=a
endif

导致 vim 默认为 visual 模式,与之前的默认模式不一致,操作不顺手。

我们可以自己新建一个 $HOME/.vimrc 写入自己想要的配置,比如代码高亮

if has("syntax")
  syntax on
endif

有了 $HOME/.vimrc 之后就不会读取 /usr/share/vim/vim80/defaults.vim 了。

Unknown SSL protocol error in connection to

在做 telegram bot 的时候遇到一个问题:Unknown SSL protocol error in connection to

解决方案

先贴解决方案:在能够正常访问 api.telegram.org 的服务器上执行 ping api.telegram.org 记录下 ip 地址,然后在墙内的服务器上绑定下 host,将 api.telegram.org 绑定到刚才记录的 ip 上。

原因分析

由于众所周知的原因,api.telegram.org 是无法直接访问的,所以我在使用 python-telegram-bot 的时候设置了代理,配置如下:

updater = Updater(token='TOKEN', request_kwargs={'proxy_url': 'socks5://127.0.0.1:1080/'})

但是设置了代理之后但还是不行,于是我试了下 curl google.com -x socks5://127.0.0.1:1080 -vvv 发现可以访问,又试了下 curl api.telegram.org -x socks5://127.0.0.1:1080 -vvv 这回问题来了,在等了一阵子之后,看到这样一个报错:

*   Trying 127.0.0.1...
* TCP_NODELAY set
* SOCKS5 communication to api.telegram.org:443
* SOCKS5 connect to IPv4 243.185.187.39 (locally resolved)
* SOCKS5 request granted.
* Connected to (nil) (127.0.0.1) port 1080 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* Unknown SSL protocol error in connection to core.telegram.org:443 
* Curl_http_done: called premature == 1
* stopped the pause stream!
* Closing connection 0
curl: (35) Unknown SSL protocol error in connection to api.telegram.org:443 

这就很奇怪了,代理是可用的,但是 tg 却访问不了,在 Google 查询半天终于搜到了这样一篇文章 点击查看,遇到了跟我一样的问题。

主要是国内 DNS 服务器的问题,被墙的网址被分配了一个错误的 IP 地址。与代理服务器上连接的 IP 地址不同。

梦记

做了一个了不起的梦。
在梦里我被空投到了一座荒岛上,但是似乎并没有按照套路出牌,这个岛遭到了怪兽入侵,怪兽的战斗力比我强太多了,完全不是一个量级,我只有逃跑躲藏的份。

怪兽都是长相很恶心的那种,我被吓得不轻,在经过和怪兽一阵搏(躲)斗(藏)之后,新增的怪兽越来越厉害,根本打不过,我被一个恶心的大怪兽追到一座大楼前(就像刺激战场里面沙漠地图的那种高楼),在我以为无处可逃的时候,那个怪兽竟然不追我了,我刚舒了一口气,这时候楼里竟然冲出来一只楼房那么大的怪兽,并且带来了一阵不知道来自哪里的辐射,空间都扭曲了,我就赶紧跑,但是没跑过辐射过来的速度,我被辐射了,突然就变异了。。。身子变大,拥有了飞天的能力,抗击打能力也超强(绿巨人???写到这里我才意识到这个问题)我就赶紧往出飞,逃跑的时候经过一处空间扭曲的地方,那一处空间看着是透明的但就是穿不过去,我就贴着空间墙(就是一个透明的却穿不过去的墙一样的东西)飞到了一个大马路上,发现十字路口有很多警车,美国那种的。。然后发现复仇者联盟正在集结。。。

我本来是莫名其妙就拥有了飞的能力,这时候梦里的我给自己找了一个会飞的理由。从这时候开始,我穿了钢铁侠的战衣,双手往后放,手脚同时喷火就可以飞得很高很快,我就在天上飞了几圈,还能听到下面的人小声议论:这就是钢x侠(没记清楚)。又飞了一会,然后我他妈的就醒了,遗憾没能和钢铁侠并肩作战。

我分析能做这个梦主要有三个因素:

  1. 睡觉之前我玩了剑三,剑三确实是个自由度很高的游戏,我在里面用轻功上下左右飞了半天。
  2. 看过复仇者联盟系列和环太平洋1-2。
  3. 最近在玩手游“吃鸡”。

语言不足以描述梦里的精彩体验,虽然以前也常做飞行梦,但是这次的钢铁侠套装惊艳到我了,真的是 amazing!醒来之后有点小激动,所以立马记下来,但还是忘掉了很多细节。。

人脑真的神奇。

服务器迁移

checklist:

  1. 安装 nginx、mysql、php71
  2. scp /data0/ 文件、nginx 配置、https 配置、/home/ 文件
  3. mysql 数据导入

    • 旧服务器上执行 mysqldump -uroot -p --all-databases > mysql.sql
    • scp 到新服务器
    • 新服务器登录 mysql 然后执行 source /path/to/mysql.sql
  4. crontab 任务迁移