Linux的cron和crontab

一 cron

crond位于/etc/rc.d/init.d/crond 或 /etc/init.d 或 /etc/rc.d /rc5.d/S90crond,最总引用/var/lock/subsys/crond。

 

cron是一个linux下的定时执行工具(相当于windows下的scheduled task),可以在无需人工干预的情况下定时地运行任务task。由于cron 是Linux的service(deamon),可以用以下的方法启动、关闭这个服务:
usr/sbin/service crond start //启动服务
usr/sbin/service crond stop //关闭服务
usr/sbin/service crond restart //重启服务
usr/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
usr/sbin/service crond start

现在cron这个服务已经在进程里面了,我们就可以用这个服务了。

 

二 crontab

crontab位于/usr/bin/crontab。

 

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e 进入vi编辑模式,编辑的内容一定要符合下面的格式:

*/1 * * * * ls >> /tmp/ls.txt
这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

分钟 (0-59)
小時 (0-23)
日期 (1-31)
月份 (1-12)
星期 (0-6)//0代表星期天

除了数字还有几个个特殊的符号就是”*”、”/”和”-“、”,”,*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-“代表从某个数字到某个数字,”,”分开几个离散的数字。以下举几个例子说明问题:

每天早上6点
0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时
0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * echo “Have a good dream:)” >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line

1月1日早上4点
0 4 1 1 * command line

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

 

三 编辑/etc/crontab配置文件
cron的系统级配置文件位于/etc/crontab。
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab配置文件,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab -e进行的配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root      //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/    //使用者运行的路径,这里是根目录

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。

 

四 实例

————————————–

基本格式 : [参数间必须使用空格隔开]
*  *  *  *  *  command
分 时 日 月 周 命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd

 

Linux下ps命令详解

linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

ps工具标识进程的5种状态码:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process

名称:ps
使用权限:所有使用者
使用方式:ps [options] [–help]
说明:显示瞬间行程 (process) 的动态
参数:
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程

au(x) 输出格式 :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
D: 不可中断的静止
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令

范例:

ps
PID TTY TIME CMD
2791 ttyp0 00:00:00 tcsh
3092 ttyp0 00:00:00 ps
% ps -A
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kflushd
3 ? 00:00:00 kpiod
4 ? 00:00:00 kswapd
5 ? 00:00:00 mdrecoveryd
…….
% ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]

具体命令解释如下:
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。

2)ps -A 显示所有程序。

3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

4)ps -e 此参数的效果和指定”A”参数相同。

5)ps e 列出程序时,显示每个程序所使用的环境变量。

6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

7)ps -H 显示树状结构,表示程序间的相互关系。

8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

9)ps s 采用程序信号的格式显示程序状况。

10)ps S 列出程序时,包括已中断的子程序资料。

11)ps -t<终端机编号>

指定终端机编号,并列出属于该终端机的程序的状况。

12)ps u

以用户为主的格式来显示程序状况。

13)ps x

显示所有程序,不以终端机来区分。

最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

利用fiddler 伪造response绕过js验证

很多网站把数据的校检放在了前端由JS程序完成,JS程序通过ajax请求服务器获得返回值,判断用户输入是否是正确的,为了防止ajax请求被伪造,一般会传递一个变动的回调参数,例如百度验证邮箱的地址是https://passport.baidu.com/v2/?regmailcheck&token=6a60f2edd88a4026f1b7aeaf4889cce4&tpl=tb&apiver=v3&tt=1358522488317&email=ssfsdfsfsssfsfsa%40sina.cn&callback=bd__cbs__109e3a

可以看出来回调参数是bd__cbs__109e3a  ,109e3a  这个参数是变动的,返回值是bd__cbs__109e3a ({“errInfo”:{ “no”: “0” }, “data”: {}}),所以如果伪造请求的话必须截取请求参数,并返回对应的标识符。

利用fiddler 的autoresponder 可以对请求的url和参数进行正则匹配截断,然后去请求另一个对应的处理程序返回结果。

例如我设置的rule editor :

regex:https://passport.baidu.com/v2/?regmailcheck(.+)callback=(?<args>.*)$

http://hixss.sinaapp.com/s.php?s=${args}

s.php为处理程序

[php]

header("Content-type:text/plain");
$s=$_GET["s"];
echo $s.'({"errInfo":{ "no": "0" }, "data": {}})’;
[/php]

debian设置笔记

1、设置IP地址、网关
nano /etc/network/interfaces /etc/network/interfacesbak #备份原有配置文件
nano /etc/network/interfaces #编辑网网卡配置文件
auto lo
auto eth0 #开机自动连接网络
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static #static表示使用固定ip,dhcp表述使用动态ip
address 192.168.21.166 #设置ip地址
netmask 255.255.255.0 #设置子网掩码
gateway192.168.21.2 #设置网关
ctrl+o #保存配置
ctrl+x #退出
2、设置dns
cp /etc/resolv.conf /etc/resolv.confbak #备份原有dns配置文件
nano /etc/resolv.conf #编辑配置文件
nameserver 8.8.8.8 #设置首选dns
nameserver 8.8.4.4 #设置备用dns
ctrl+o #保存配置
ctrl+x #退出

可自升级物联网设计略谈

我没参考圈内人士怎么设计的,完全依照自己的想法,所以只能叫略谈,等我有时间参照别人设计方案时,再做比较。

物联网即把物连接到网络,故物品和网络之间必须有交换信息的控制设备,这种设备可以是微型电脑(例如:Raspberry pi)也可以是单片机(arm c51系列),但必须能接入网络。

接入网络方式有:局域网 、移动网、电信/联通 等骨干网络。局域网需要铺设线路、控制距离有限,小范围尚可,大范围就不行了,但是可以让局域网接入互联网,这就靠自己的本事了。

移动网不受地域限制,但是传输数据成本高、速度慢,根据应用场景去选择。

控制设备直接接GPS或继电器等控制设备运行状态。

下面谈整个系统设计:

把每个控制设备看成子节点,在外网或局域网建立控制服务器,子节点与控制服务器通信,读取或下达命令。

如果不好获取子节点设备IP可采取从属模式,即子节点读取控制服务器命令库,从而进行相应控制,这样消耗流量时效稍差。

采取主动模式,控制服务器直接与子节点进行socket通信,下达命令。

命令格式采取json模式,里面包括软件版本号,这样子节点可与自身软件版本号比较,进行升级。所以只要把环境搭建好,其它的就不用管了,想修改程序只要在控制服务器修改版本号就行,子节点自动下载最新程序进行更新。

具体实现过程不详述,有兴趣联系我。