2017-04-08 18:29:14 qianyizhou17 阅读数 325
  • Shell脚本编程/PHP智能应用

    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

    689 人正在学习 去看看 李强强
  • 内容说明
    本次的内容,是一次 MOOC 课程的作业。具体的,是使用汇编对 Linux 系统调用部分进行模拟实现,从而更加直观的验证 Linux 系统的基本机制。

  • 作业声明
    qianyizhou17 + 原创作品转载请注明出处 + 《Linux 内核分析》MOOC 课程 http://mooc.study.163.com/course/USTC-1000029000

  • 实验准备
    1 本次实验并没有使用 MOOC 课程上提供的实验楼的环境,而是自行搭建了 64Bit Ubuntu 虚拟机。
    2 本次试验使用了 Ubuntu 16.04,环境搭建和软件安装部分,可以参照上一篇博客的环境搭建部分。
    3 之前完成过 qemu 的实验,rootfs.img 的制作,gdb 的跟踪等。

  • 实验操作
    1 下载示例中的 menu 代码:Git clone https://github.com/mengning/menu.git ,并使用 test_fork.c 替换 test.c 文件:$ mv test_exec.c test.c
    2 注意:在简易的系统初始化完成之后,再加入断点(否则系统在初始化阶段即进入 sys_execve 等断点)
    3 分别在 sys_execve、load_elf_binary、start_thread等处打入断点
    这里写图片描述
    4 menuos中输入 exec,进行断点观察。在调用 start_thread时,gdb 中键入 po new_ip 来观察程序入口信息,显示输出为 0x8048736。
    事先在外部调用$ readelf -h hello ,显示其 Entry point address: 信息与 new_ip 的地址信息一致。
    这里写图片描述

  • 分析总结
    1 可执行程序使用一定的文件格式来描述该程序的入口信息、数据段、代码段、依赖信息等,目的是加载时使用。
    2 执行目标程序的本质
    就是将目标程序(使用 ELF 等格式描述)加载到“宿主”进程的地址空间中去、覆盖“宿主”进程的栈空间,并将“宿主”进程的 cs:ip 指向目标程序的入口地址。从而,“宿主”进程的执行便转化为目标程序的执行。
    3 Linux 下如何装载一个可执行程序?
    我们使用系统调用 exe*(对 execve 的一系列封装)来装载一个可执行程序,并传递相关参数和环境变量:int execve(const char * filename,char * const argv[],char * const envp[]);
    3.1 系统调用 execve 在陷入内核态后调用 sys_execve,逐层调用了 do_execve, do_execve_common, exec_binprm
    3.2 在 exec_binprm 中,使用 search_binary_handler 实现对不同格式的可执行文件进行不同的解析和执行
    3.3 对于 elf 文件,将使用 load_elf_binary 来进行执行。其中,对于静态链接的程序,将直接传递可执行文件入口地址给 elf_entry;对于动态链接程序,将采用广度优先的搜索方式借助 ld 来加载依赖库和依赖文件,最后才由 ld 返回可执行文件的入口地址。
    3.4 完成加载后,使用 start_thread 来更换当前进程的堆栈信息为目标可执行程序在 ELF 中描述的信息
    3.5 在返回时,当前进程消失,取而代之的是运行“目标可执行程序”的进程
    3.6 参数传递
    参数通过系统调用 execv 传递,并传递到内核中,最终传递给目标进程

2017-12-29 09:39:00 weixin_30325971 阅读数 293
  • Shell脚本编程/PHP智能应用

    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

    689 人正在学习 去看看 李强强
两种解决方案:个人推荐第二种,使用crontab来定时执行任务
 
1.shell代码如下:
nohup command &. 解释: 后台永久运行command命令。
(nohup表示后台永远执行,不随终端退出而终止。&表示后台运行,随着终端退出程序而终止。两个一起就是后台永久运行了)
 1 #!/bin/bash
 2 
 3 #需要定时执行的程序
 4 program=testapp 5 
 6 #获取当前时间,例如20171129 <---> perDate=$(date "+%Y%m%d")
 7 #获取一天后的时间
 8 afterdata=$(date -d +1day "+%Y%m%d")
 9 #afterdata=20170323
10 #每五分钟仅仅执行一次,设置标志位
11 onceflag=0
12 
13 echo 'Task schedule Time: ('$program') program Waiting to run(once per 5min)...'
14 
15 #死循环,当检测到当前时间段分钟数符合条件,则开始执行程序
16 while true ; do
17         #获取当前分钟数, date获取当前日期,%M来获取当前分钟数。
18         presentminutes=$(date "+%M");
19         
20         if [ `expr $presentminutes % 5` -eq 0 ]
21         then
22             if [ $onceflag -eq 0 ]
23             then
24                 echo 'Now minute is '$presentminutes''
25                 echo 'The program ('$program') running...'
26                 echo $program $afterdata    //打印测试可执行程序格式是否正确
27                 $program $afterdata
28                 echo 'The program ('$program') stopped...'
29                 onceflag=1
30             else
31                 continue
32             fi
33         else
34             onceflag=0
35         fi
36         
37         sleep 1 //一秒查询一次当前时间点
38 done

 

2.也可以使用crontab来完成每五分钟定时执行一次可执行任务。关于crontab可以参考我其它博客。



转载于:https://www.cnblogs.com/linux-wang/p/8142844.html

2014-07-25 17:45:38 zhoujj303030 阅读数 1543
  • Shell脚本编程/PHP智能应用

    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

    689 人正在学习 去看看 李强强

 Crontab 语法
Crontab语法一个crontab文件用五个段来定义:天,日期和时间,和一个要定期执行的命令代码。
        command to be executed
          -
            |
            +----- day of week (0 - 6) (Sunday=0)
         +------- month (1 - 12)
      +--------- day of month (1 - 31)
   +----------- hour (0 - 23)
+------------- min (0 - 59)


环境:

     RedHat Linux
     JDK1.6

功能说明:

     每天早上2点钟执行一次java程序。

操作步骤:

     1、首先,将java程序打包成为jar包,包名为unarchivegzipandinsertintodb2_0_1.jar,注意要设置该jar包的MANIFEST.MF的Main-Class的类,
        将jar包复制到/usr/local/目录下,同时将该jar包所依赖的jar包也复制到/usr/local/目录下,如test.jar;
     2、在/usr/local/目录下创建shell脚本,脚本名称auto.sh,脚本内容为:
          #!/bin/bash 
   cd /usr/local/
#!/bin/sh
cd `dirname $0`
 /usr/local/jdk1.6.0_25/bin/java -Xms256M -Xmx1024M -cp  /usr/local/jdk1.6.0_25/lib/tools.jar:/usr/local/jdk1.6.0_25/lib/dt.jar:/data/appLog/UnArchiveGzipAndInsertIntoDB2_0.1/UnArchiveGzipAndInsertIntoDB2/../lib/activation.jar:/data/appLog/UnArchiveGzipAndInsertIntoDB2_0.1/UnArchiveGzipAndInsertIntoDB2/../lib/advancedPersistentLookupLib-1.0.jar:/data/appLog/UnArchiveGzipAndInsertIntoDB2_0.1/UnArchiveGzipAndInsertIntoDB2:/data/appLog/UnArchiveGzipAndInsertIntoDB2_0.1/UnArchiveGzipAndInsertIntoDB2/../lib/systemRoutines.jar:/data/appLog/UnArchiveGzipAndInsertIntoDB2_0.1/UnArchiveGzipAndInsertIntoDB2/../lib/test.jar::.:/data/appLog/UnArchiveGzipAndInsertIntoDB2_0.1/UnArchiveGzipAndInsertIntoDB2/unarchivegzipandinsertintodb2_0_1.jar: test.unarchivegzipandinsertintodb2_0_1.UnArchiveGzipAndInsertIntoDB2 --context=Default "$@" 
    
     说明:
     /usr/java/jdk1.6/是java安装路径
     java命令后面必须要加入-cp参数,cron在执行时不加载系统环境变量,如果不加这个参数,程序不会正常执行,
         即使命令行可以正确执行,但在cron调用时也会出现问题。

     
     3、使用crontab命令,输入如下内容:
     00 02 * * * /usr/local/unarchivegzipandinsertintodb2_0_1.sh   
     说明:
     每天早上两点钟执行/usr/local/unarchivegzipandinsertintodb2_0_1.sh脚本,crontab的语法格式表达的含义可以参考相关手册。
     
     最近经常碰到关于crontab不能执行的,初步总结了有以下几个原因:

第一,脚本的原因:大多数情况下,我们要相信科学,相信计算机,不是有鬼,就是我们的脚本的问题,这种问题导致crontab不能执行的概率占到 70%以上。因为程序执行到某一步导致crontab终止执行,我就碰到一次在迁移代码的时候将数据库连错了。导致无法访问而死在那里了。

第二,执行环境问题,当我们碰到第一情况下,一般都可以通过手动执行程序将问题扼杀在摇篮里,一般情况下高手是不应该犯第一种错误的。问题是当我们 手动执行成功而crontab不能执行的时候,笔者碰到一次就是执行环境的问题,例如相关路径的设置问题。解决方案:在代码最前面执行 source /home/user/.bash_profile

第三,系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:date -s ********

第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。

第五,crontab 守护进程死掉了。这种情况是极少发生的,但也不排除,当我们实在是找不到其他原因的时候可以用。解决方案:重启该进程。

 

另外,介绍大家一个关于如何查看crontab最修修改时间的方法:

进入目录/var/spool/cron/里面会有N个用户名为文件名的文件,只要建立过crontab的用户在这里都会有以该用户名为文件名的文件,该文件的最后修改时间就是该用户的的crontab的最后修改时间。

2016-02-16 14:42:43 dub_lys 阅读数 381
  • Shell脚本编程/PHP智能应用

    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

    689 人正在学习 去看看 李强强
1.Linux中怎样判断某一进程是不是运行?
2.Linux中怎样倒排序查看,服务器各类进程数?
3.Linux中怎样利用awk检查程序是否执行?

通过shell结合awk可以很好判断某一进程是不是运行,或者某一程序文件是否被执行,下面以php为例来说明一下。
定义一个crontab,每一分钟执行一次,时间间隔为一分钟,可能下一次执行的时候,上次还没有执行完,所以我们要做一下判断。

一、test.php在运行的情况,查看进程
shell 命令
# ps -ef |grep test.php
root     29884 29881  0 10:48 ?        00:00:00 awk NR==1{\?if ($8 == "grep"){\?system("cd /home/test/cron && php test.php");\?}else{\?print "running";\?}\?}
root     29888 29884  0 10:48 ?        00:00:00 sh -c cd /home/test/cron && php test.php
root     29889 29888  1 10:48 ?        00:00:00 php test.php
root     30265  7620  0 10:48 pts/0    00:00:00 grep test.php


二、test.php不在运行的情况,如下
shell 命令
# ps -ef |grep test.php
root     30265  7620  0 10:48 pts/0    00:00:00 grep test.php

三、test.sh脚本如下
shell 命令
# cat test.sh
ps -ef|grep test.php | awk 'NR==1{\
if ($8 == "grep"){\
system("cd /home/test/cron && php test.php");\
}else{\
print "running";\
}\
}'
 
exit;
ps -ef|grep test.php,当第8列等于grep的时候,test.php是没有运行的,system调用php执行test.php,反之在运行。

四、实际运行的情况
执行test.sh后,一天差不多,会出现一次这样的情况,
shell 命令
# ps -ef |grep test.php
root      8043  8040  0 09:33 ?        00:00:00 awk NR==1{\?if ($8 == "grep"){\?system("cd /home/test/cron && php test.php");\?}else{\?print "running";\?}\?}
root      8044  8043  0 09:33 ?        00:00:00 sh -c cd /home/test/cron && php test.php
root      8045  8044  0 09:33 ?        00:00:00 php test.php
root     18952 18947  0 Oct14 ?        00:00:00 awk NR==1{\?if ($8 == "grep"){\?system("cd /home/test/cron && php test.php");\?}else{\?print "running";\?}\?}
root     18954 18952  0 Oct14 ?        00:00:00 sh -c cd /home/test/cron && php test.php
root     18955 18954  0 Oct14 ?        00:00:01 php test.php
root     23430 23410  0 10:32 pts/0    00:00:00 grep test.php

然后导致php程序卡死,一直没有搞清楚,为什么会这样。

五、解决办法
shell 命令
# cat t.sh
t=0
eval $(ps -ef |grep test.php |awk 'BEGIN {t = 0;}{if ( $8 == "php"){t++;}}END{print "t="t;}');
 
if [ $t -gt 1 ]
then
 kill -9 $(ps -ef |grep test.php |awk '{L[NR]=$2;a[NR]=$8;}END{for (i=1;i<=NR;i++){if(a[i] != "grep"){print L[i];}}}');
else
 echo "$t no killing";
fi
 
exit;
t.sh的意思,每隔一段时间检查一下,test.php正在被执行的次数,如果大于1,就强行结束掉,所有根test.php有关的进程。

六、awk查看,倒排序查看,服务器各类进程数
shell 命令
# ps -ef| awk '{a[$8]++}END{for(i in a){print i,a[i] | "sort -r -k 2"}}'
2010-08-02 18:02:00 wangyongshan 阅读数 36
  • Shell脚本编程/PHP智能应用

    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

    689 人正在学习 去看看 李强强

环境:

  RedHat Linux

  JDK5.0

  功能说明:

  每天早上2点钟执行一次java程序,读取Oracle数据库的数据进行备份。

  操作步骤:

  1、首先,将java程序打包成为jar包,包名为auto.jar,注意要设置该jar包的MANIFEST.MF的Main-Class的类,

  将jar包复制到/usr/local/目录下,同时将该jar包所依赖的jar包也复制到/usr/local/目录下,如classes12.jar;

  2、在/usr/local/目录下创建shell脚本,脚本名称auto.sh,脚本内容为:

  #!/bin/bash

  cd /usr/local/

  /usr/java/jdk1.5/bin/java -jar auto.jar -cp /usr/java/jdk1.5/lib/tools.jar:/usr/java/jdk1.5/lib/dt.jar:/usr/local/classes12.jar:.

  说明:

  /usr/java/jdk1.5/是java安装路径

  java命令后面必须要加入-cp参数,cron在执行时不加载系统环境变量,如果不加这个参数,程序不会正常执行,

  即使命令行可以正确执行,但在cron调用时也会出现问题。

  3、使用crontab命令,输入如下内容:

  00 02 * * * /usr/local/auto.sh

  说明:

  每天早上两点钟执行/usr/local/auto.sh脚本,crontab的语法格式表达的含义可以参考相关手册。

  4、重启cron进程:

  /etc/init.d/cron restart

  经过上面的配置,每天早上两点钟执行/usr/local/auto.sh脚本对数据进行备份。

没有更多推荐了,返回首页