1、crontab 命令
2、 flock
使用flock命令确保脚本单例执行
问题的背景:
我们常常需要通过crontab部署某个脚本运行某些定时任务,但在实际的过程中,一旦处理不好可能导致在同一时刻出现脚本的多个运行副本,比如crontab的调度是每5 分钟运行一次脚本,如果运行的脚本能够在5分钟内处理完任务并退出,则没问题,同一时刻最多只有一个脚本在运行,但如果脚本如果无法在5分钟内处理完任务并退出,则意味着在下一个5分钟,脚本又会被crontab调起来,出现了同一时刻有2个甚至更多的脚本事例在运行,对应一些依赖关系,需要串行处理的脚本来说,可能会导致数据相互覆盖等问题。
为了解决这个问题,脚本必须能够自我保护,即在启动之前判断是否已经有脚本启动了,若当前已经有脚本启动了,则虽然crontab调度到该脚本,但脚本自身会马上退出。
解决问题的思路很多,其中一种笔者觉得比较简便的是:使用文件锁,在linux中,提供了flock命令,具体格式如下:
1, flock [-sxon] [-w timeout] lockfile [-c]command...
2, flock [-sxun] [-w timeout] fd
参数说明如下:
-s为共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。
-e为独占或排他锁,在定向为某文件的FD上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置共享锁或独占锁都会失败。只要未设置-s参数,此参数默认被设置。
-u手动解锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。
-n为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回1,并继续执行下面语句。
-w设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回1,并继续执行下面语句。
-o必须是使用第一种格式时才可用,表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。
-c执行其后的comand。
flock 是对于整个文件的建议性锁。也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的。它的第一个参数是文件描述符,在此文件描述符关闭时,锁会自动释放。而当进程终止时,所有的文件描述符均会被关闭。于是,很多时候就不用考虑解锁的事情。
#Pledge Rec Siti FTP Export
#*/15 08-12 2 * * flock -xn $JSD/lock/L102602.lock $Dcoo/NC.J.071.Coordinator.O_PLEDGE_REC_SITI_EXPORT.sh >>$JSD/log/NC.J.072.Coordinator.O_PLEDGE_REC_SITI_EXPORT.log
3、nohup
nohup 命令
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
nohup命令及其输出文件
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup command &
使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
使用 jobs 查看任务。
使用 fg %n 关闭。
fyi:http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html;4.find 查找文件
在当前目录下搜索指定文件:
find . -name test.txt
在当前目录下模糊搜索文件:
find . -name '*.txt'
在当前目录下搜索特定属性的文件:
find . -amin -10 # 查找在系统中最后10分钟访问的文件
find . -atime -2 # 查找在系统中最后48小时访问的文件
find . -empty # 查找在系统中为空的文件或者文件夹
find . -group cat # 查找在系统中属于 groupcat的文件
find . -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find . -mtime -1 #查找在系统中最后24小时里修改过的文件
find . -nouser #查找在系统中属于作废用户的文件
find . -user fred #查找在系统中属于FRED这个用户的文件
在当前目录搜索文件内容含有某字符串(大小写敏感)的文件:
find . -type f | xargs grep 'your_string'
在当前目录搜索文件内容含有某字符串(大小写敏感)的特定文件:
find . -type f -name '*.sh' | xargs grep 'your_string'
在当前目录搜索文件内容含有某字符串(忽略大小写)的特定文件:
find . -type f -name '*.sh' | xargs grep -i 'your_string'
5. php 使用sftp/ftp抓取文件
FRY GET FILE
<?php
$connection = ssh2_connect('113.57.154.56', 22);
ssh2_auth_password($connection, 'HCC_Daiba', '1234@abc');
$sftp = ssh2_sftp($connection);
echo $sftp;
#echo "connect";
$statinfo = ssh2_sftp_stat($sftp, '/daiba/123/123.TXT');
#echo $statinfo;
$realpath = ssh2_sftp_realpath($sftp,'/daiba/123/123.TXT');
$stream = fopen("ssh2.sftp://{$sftp}/daiba/123/123.TXT", 'r');
echo fread($stream,filesize("123.TXT"));
fclose($stream);
?>
and Write File
<?php
$connection = ssh2_connect('113.57.154.56', 22);
ssh2_auth_password($connection, 'HCC_Daiba', '1234@abc');
$sftp = ssh2_sftp($connection);
echo $sftp;
#echo "connect";
$statinfo = ssh2_sftp_stat($sftp, '/daiba/123/123.TXT');
#echo $statinfo;
$realpath = ssh2_sftp_realpath($sftp,'/daiba/123/123.TXT');
$stream = fopen("ssh2.sftp://{$sftp}/daiba/123/abc.TXT", 'w+');
$txt= "abcabc";
fwrite($stream,$txt);
fclose($stream);
?>