shell下python脚本的输出转向

一个用python写的脚本,在本地测试的时候用python的print输出了一些状态信息,用于观测程序运行的状况。脚本自身比较耗时(中间故意设置了延时)。
在部署到服务器上后,需要后台运行,因此就想当然的转向输出到一个文本log中:
python script.py > output.log &
结果发现log文件一直是空白(程序在持续运行中),但正常应该是有文本记录的。结果网上搜索才发现,python脚本默认是在脚本整个执行完成后才输出的。(参考:https://unix.stackexchange.com/questions/182537/write-python-stdout-to-file-immediately/182542#182542
当然,知道问题后解决方案也很简单:
python -u script.py > output.log &

两台服务器的缺失数据同步

一台主服务器上的部分数据文件缺失,需要在另一台备份服务器上拷贝回来,但不想使用rsync进行全局同步,因此就需要对缺失文件进行直接处理。
但文件数量比较少的时候,直接scp回来即可,但数量较多的时候,就不能人工处理了,需要使用shell脚本处理:
1. 生成缺失文件列表,如mis.txt
2. 让主服务器可以用key方式ssh到备份服务器上
3. 逐个文件导入:
while IFS='' read -r line ;do scp user@backup-server:/path/$line .; done < mis.txt

两台服务器皆为ubuntu环境。

macbook 12.2.2测试版外接samsung SyncMaster 2333显示器问题

在这个public beta版本之前,这台samsung SyncMaster 2333外接显示器工作正常,系统升级public beta后突然不认之前的分辨率(1920X1080),变成13.9吋800X600的显示器,Scaled模式也只能到1280X1024分辨率了。
不能认识,于是注册了feedback账号作为bug汇报,但在public beta2版本时此问题依然未解决。

今天突然在stackexchange上搜索到了一个可用的方案,大喜,记录之:

You can go to System Preferences > Displays, then option-click (press option key while left-clicking) on Scaled to expose additional resolutions that aren’t exposed with a normal left-click.

虽然这种模式的1920X1080不是全屏(有小部分黑边),但比之前的模式大好!

–update: public beta3 解决了这个问题,看来feedback还是有作用的。

使用AWK过滤数据

现有大批量的文本数据,需要截取其中符合一定范围的数据(减少数据量)。数据的格式如下:

42.69,-84.6,1
41.74,-86.21,1
42.26,-83.73,2
43.01,-83.68,6
42.74,-84.48,3
42.29,-83.7,4
42.29,-83.25,2
41.36,-82.07,1
42.99,-83.73,3
42.24,-84.41,1

其中,截取的目标范围是第一列的数字在一定范围,如40-44,第二列在另个范围。
开始我是将其全部导入到数据库中(copy命令),然后再进行delete操作,但随数据的处理,数据库的速度越来越慢,导致数据的处理速度不可接受。因此想在入库前就先行截取。Google后发现了解决方案:Using AWK to Filter Rows
具体解决方案如下:
awk -F',' '{ if($1 <= 44.0 && $1>=41.0 && $2<=-82.0 && $2>=-87.0) {print }}' 20161026-2300-point.csv

数据巧处理:重复数据的合并处理

要处理一批数据,形式为:
lat,lon,num
每个文件有一个timestamp,文件数量巨大,开始我感觉lat、lat应该唯一,但后来检查数据后发现,这批数据存在大量重复的点(可能之前高精度数据是唯一的,但精度降低后导致有重复数据出现),因此需要专门处理。
开始是想在bash里直接处理,但点位相同的数据,其后的num感觉应该sum后替换,因此还没有想到较好的方法。
后来一想数据不是要入库么,入库后先放松唯一性检查,然后通过group操作,可以简单获取到对应的结果。
SQL:
create table sum_point as
select ts,lat,lon,sum(num) from point group by ts,lat,lon

linux下进入乱码目录

若一个目录在用户上传后是乱码,如何进入此目录呢?

1. 若首字母是英文或数字,可以输入首字母后通过tab补齐方式进入。

2. 可通过inode更名方式进入:

使用inode,重新命名。
$ ls -i1
获取inode是多少
$ find -inum $inode -exec mv {} $new_file_name \;
使用find命令重新命名,其中$inode是上一步ls获取到的数字,$new_file_name是新的文件名。

3. 可以通过mc命令菜单式进入(最简单直接)。

遭遇chipset heat sink not detected问题

我使用的一台DELL T7400工作站,在一次远程重启后彻底趴窝了。到办公室后,发现系统在自检的时候就无法通过,提示:

chipset heat sink not detected

在网上搜索到一个最相关的文章:
http://www.chinafix.com/thread-70694-1-1.html
提示是散热器的问题。
首先拆机器,鼓风机除尘,看看有没有解决的可能,但无解。
继续拆CPU风扇,感觉没有问题,但也重新更换硅胶,依旧无解。
最后发现在主板上还有一个散热风扇,而且其风扇的固定脚断了一根,但风扇本身很牢固,估计是主板的自检程序是根据固定脚的简单电路进行检查,尝试使用一个回形针直接插上。搞定!

感谢李大侠的帮助。

基于ibdata1的mysql数据库恢复

服务器的阵列坏掉后,数据恢复公司进行了抢救后,大部分数据都恢复回来。但MYSQL数据库发现仅恢复了部分数据,即部分数据库是完整的,其他的库仅恢复了空表。其中有一个很大的文件,即ibdata1,约200多GB,估计可以用来恢复数据库。

网上搜索后,发现是可行的,处理方法如下:

1. 在一台新机器上搭建相同的系统环境,包括一个全新的mysql环境。
2. 停止mysql服务。即sudo service mysql stop
3. 将恢复后的ibdata1、ib_logfile*文件拷贝到新机器的/var/lib/mysql/目录下,覆盖之前的文件。同时修改/etc/mysql/my.cnf文件,在mysqld部分添加:
[mysqld]
innodb_force_recovery = 6

4. 拷贝需要恢复的数据库文件(空表,即包括*.frm文件的目录)到新机器的/var/lib/mysql/目录下
5. 重启mysql服务,即sudo service mysql start,然后用mysql命令检查数据是否有恢复。若能恢复回来,则可以用mysqldump进行备份导出。

在ubuntu服务器上使用dell md3060e及其管理程序

之前采购了一批服务器和存储,几经折腾后最终安装在学校的机房。服务器上安装了ubuntu 14.04系统,存储是dell的直连存储md3060e(我第一次用这个设备),硬件上安装好后发现不知道怎么做RAID。于是在dell官网上找到了对应的程序,发现有个linux版本的程序:StorageEnclosureManagement,“号称”可以支持debian和ubuntu。

DELL的官方程序下载地址上是这样描述的:

Debian74 Storage Enclosure Management Software 1.3

Storage Enclosure Management Software for MD3060e JBOD Arrays, version 1.3, Debian74 installer
Fixes & Enhancements
Fixes:
-New OS support for Ubuntu 14.04, SLES 12, and ESXi 5.5 (CLI only).
-Implement build version number.
-6TB 4096n support.
-Ability to update HBA adapter firmware
–LSI 9207-8e
–LSI 9206-16e

之前的1.2版本声明是支持ubuntu 12.04版本。但这个版本我下载后在ubuntu 14.04上无法安装,提示为不支持的操作系统。

Warning: This OS is unsupported: debian14.04. Installer will now exit.

于是,尝试修改系统的发行版本信息,看看能不能骗过安装程序的监测。

sudo nano /etc/lsb-release
将其中的版本信息修改为debian wheezy 7.4。

修改完成后,可以正常安装了。

BTW:本来我还以为md3060e可以直接支持raid,但搜索一圈下来,发现这是个“直连”系统,意思是本身不支持RAID?Dell的技术支持也不是很靠谱,两圈电话问下来,也没有解决问题。最后给我推荐安装DELL的MDSM软件,但这个软件本身也不支持md3060e,还是需要其他MD3主控阵列才可以。因此要考虑使用mdadm或lvm来软管理这个磁盘柜了。