用了这么些日子的linux/unix系统,也和别人一起合作开发了不少程序,发现高手都喜欢在命令行上操作,而且控制程序的运行偏好于使用脚本,加上参数如:start、restart、stop等。

后来自己开发程序,也越来越觉得这样是个好的方法:

1)节省时间,一键操作一系列步骤,需要记住的操作只有一两个。

2)降低出错概率,一次成功,次次成功。

3)提高通用性,同一套启动脚本的代码,可以被用在不同的程序上,需要修改的仅仅是待执行的程序命令。这也在另一个方面说明在命令行上操作程序的好处(其实每个linux程序归根到底都得在命令行上执行)。

4)通过启动脚本,可以做更多的控制,比如一次只运行一个程序实例,把输出的信息重定向到日志文件中,查看状态,结束进程等。

5)可以和别的命令结合使用。

具体而言,linux的系统服务大多通过start|stop这类方式操作。在目录/etc/init.d中放着linux服务的启动脚本,在安装系统时,会把一些服务的启动脚本放在这个目录下。

同时,根据系统运行级别的不同,linux会运行/etc/rc$level.d/目录下的启动脚本。

http://www.360doc.com/content/12/0820/17/9336047_231349272.shtml

http://blog.csdn.net/acs713/article/details/7322082

有清楚的介绍。总结起来就是,系统启动时,会根据运行级别,运行/etc/rc$level/下的脚本;而这些启动脚本都是软连接到/etc/init.d/目录下的启动脚本;也就是说/etc/init.d/里的脚本才是真正的启动脚本,rc*.d/只是分了个类;所以,如果想要单独操作某个服务,应当先到/etc/init.d/中去寻找。

在个人开发中,具体实践起来是(我使用的是perl):

1. 创建一个配置文件daemon.conf。这个文件是用来记录需要运行的命令,一行一个命令。

2. 创建一个startup.pl启动脚本。脚本有三个参数

## get first argument
my $cmd = shift(@ARGV);
switch ($cmd) {case "start"   { start() }case "restart" { restart() }case "stop"    { stop() }else           { usage() }
}

3. 启动之后,会创建一个文件daemon.proc记录进程信息

my $PROCESS_FILE = "daemon.proc";
my $PROCESS_CONF = "daemon.conf";

如果是start命令,则首先判断是不是已经在运行中,如果不是,则先创建daemon.proc文件,并加锁。加锁的目的是防止同时运行startup.pl文件。

flock函数是perl经常用来防止程序同时运行的方法,一般是先创建一个文件再加锁,结束时对文件解锁。不过这个加锁对有的语言可能没效果(比如java),原因待查明。。

if (-e $PROCESS_FILE) {print "fundamental services are running. Please stop them, then try again\n";exit 1;}my $fh;open ($fh, ">", $PROCESS_FILE) or die("unable to open $PROCESS_FILE");if (flock($fh,  LOCK_EX | LOCK_NB)) {## we have the lock, launch servicesmy $info = load();## form json formatmy $jsonText = $json->pretty->encode($info);print $fh $jsonText;print "services started\n";} else {## fail to get the lock, must be concurrencyprint "fail to get the lock of $PROCESS_FILE\n";exit 1;}

(linux的惯例是,在/var/lock/目录下touch创建一个文件如/var/lock/subsys/httpd,用来表示已经有http实例在运行,这个文件主要是给其他进程看的)

(同时会在/var/run目录下再创建一个文件/var/run/httpd/httpd.pid,记录进程的pid,用于stop用)

(http://www.blogjava.net/jasmine214--love/archive/2010/06/25/324502.html)

(文件的应用方式不只是记录信息)

/var/lock   锁定文件.许多程序遵循在/var/lock 中产生一个锁定文件的约定,以支持他们正在使用某个特定的设备或文件.其他程序注意到这个锁定文件,将不试图使用这个设备或文件.  

然后读取要执行的命令

sub load {## read cmds from config filemy $cmds = readFile();## collect process infomy $info = [];foreach my $cmd (@$cmds) {push(@$info, launch($cmd));}return $info;
}sub readFile {my $lines = [];open (my $fh, "<", $PROCESS_CONF) or die("unable to open $PROCESS_CONF");while (<$fh>) {chomp($_);if ($_ =~ m/^#/) {next;}## use regular expression to extract arguments,## especially those that are in Double quotation marksmy $fields = removeQuote($_=~/\s*(\".*?\"|\S+)\s*/g);push (@$lines, $fields);}return $lines;
}sub removeQuote {my @fields = @_;my $res = [];foreach my $field (@fields) {$field =~ s/\"//g;push(@$res, $field);}return $res;
}

在通过fork和exec来启动程序

sub launch {my $cmd = shift;my $child = fork();if ($child > 0) {## parent# sleep 1/4 second to ensure child is upselect(undef, undef, undef, 0.25);my $info = {};$info->{pid} = $child;$info->{cmd} = $cmd;return $info;} else {## child process## set as deamon processif (!setsid()) {print "unable to setsid()\n";exit 1;}## redirect STDERR and STDOUT to /dev/null,   ## we can also redirect them to ./logopen (STDOUT, ">/dev/null");open (STDERR, ">&STDOUT");eval {exec(@$cmd);};print "Faied to exec() cmd:".Dumper($cmd)." $@";exit 1;}
}

运行前:daemon.conf

./count.pl

运行后:daemon.proc

[{"cmd" : ["./count.pl"],"pid" : 4665}
]

如果是stop命令,则直接读取deamon.proc,杀死相应进程

sub stop {if (!-e $PROCESS_FILE) {print "no services are running\n";exit 1;}killProcess();
}sub killProcess {my $infoArray = Utils::SystemCalls->readJsonFile($PROCESS_FILE);foreach my $info (@$infoArray) {print "kill $info->{pid}\n";print `kill -15 $info->{pid}`; # send SIGTERM
  }print `rm $PROCESS_FILE`;
}

kill命令会发送一个信号给目标进程, 信号使监视与控制其他进程变为有可能。对接收进程来说,如果没有设置信号处理函数,那么在接收信号后,会执行默认操作;接收进程也可以拦截信号,自行处理。参考http://www.freeoa.net/development/perl/the-signal-under-perl_2671.html

重复多次的操作,最好脚本化。perl脚本实质上也是linux bash命令的组合,只是多了一些包装和日志,这样在命令出错时,可以知道是哪个命令出错了,并停止在出错的命令处;也可以结合perl和shell两边的优点。脚本语言的选择可以从熟练度出发。shell熟练就是用shell脚本。

习惯使用命令行的好处是,linux自带大量优秀的程序,在终端上调用这些程序十分方便,而这些程序通过管道组合起来的威力更是十分强大,可以轻松地帮我们解决问题。兼具操作的简便和运行的效率。

服务器上的linux系统一般是不带图形界面的,所以基本上所有的软件都会提供一套在命令行运行的命令,有时候图形界面反应很慢,可以通过命令行控制软件,就是需要改变一下使用习惯。

转载于:https://www.cnblogs.com/starRebel/p/6496900.html

linux service start|stop|restart相关推荐

  1. 【Linux】一步一步学Linux——service命令(146)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 service命令是Redhat Linux兼容的发行版中 ...

  2. linux service命令解析(重要)

    我们平时都会用service xxx start来启动某个进程,那么它背后究竟执行了什么? 其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service, ...

  3. Linux Service配置文件的编写

    通过编写Service配置文件,可以使用Linux的 systemctl 命令来达到管理服务的启动.自启动.停止 特定脚本.进程的目的. 编写方法: 文件命名:xxxx.service [Unit] ...

  4. Linux service之自定义服务

    前言 服务是应用程序存在的一种形式,静态的程序(即代码)运行成为进程运行于后台,从而执行规定的业务逻辑,对于后端程序而言通常是监听端口以处理来自客户端的请求.但这并非是一个服务,而只是一个运行于后台的 ...

  5. Linux service指令

  6. Dotnet创建Linux下的Service应用

    创建Service应用,是一个服务端开发的必会技能.   前言 说到服务端应用,最常见的就是API服务. 除此之外,还有一类应用,比方一个Socket的服务器.这类型的应用,本身没有Web层,当然也不 ...

  7. Linux 自定义service,并重定向输出到日志文件

    最近由于项目需要,需后台运行java application,进行一些操作,并将屏幕输出定向到日志文件中. 首先将jiar 文件拷贝到linux.这里我放在 /home/jerry 输入命令 cd / ...

  8. service mysqld restart与service mysql restart的区别

    1.前言 之前,遇到过在不同 linux 系统中启动或关闭 mysql,网上查询命令大都不一样,大致分为下面三种(以重启为例): service mysql restartservice mysqld ...

  9. linux重启网络报错Unit network-manager.service not found.

    ps:最重要的Centos 8 需要使用nmcli c reload  问题:使用 systemctl restart network 或 service network-manager restar ...

  10. 重新启动正在运行的linux,下面哪个命令行可用来马上重新启动正在运行的Linux系统()。A.restart--delay=0B.reboot-wC.halt-p...

    下面哪个命令行可用来马上重新启动正在运行的Linux系统().A.restart--delay=0B.reboot-wC.halt-p 更多相关问题 Java语言中的逻辑与( 切换开关设计用手指切换时 ...

最新文章

  1. java一维数组初始化_Java一维数组,初始化一维数组详解
  2. 剑指offerpython_剑指offer系列python实现 日更(一)
  3. VS2008+Windows DDK 7的环境配置(二)
  4. python 内置open()函数与os.open()函数的区别(打开文件)
  5. java 日期注解 xml_Spring xml注解+java注解
  6. goland设置Terminal
  7. 查询链接服务器信息,SQL Server链接服务器
  8. 哈工大人工智能作业一_想从事人工智能行业,考研选什么专业对口?
  9. sublime 如何使用less_Sublime Text3 使用教程
  10. 史上最全软考软件设计师资料
  11. 游戏夜读 | 游戏关卡设计师
  12. 1.JsDroid命令行调试命令
  13. 电脑老是弹出vrvedp_m_卸载瑞星的最简单方法 vrvedp_m卸载
  14. 记参加1024程序员节北京峰会和开发者之夜活动
  15. 基于Python的模拟人脑神经元进行学习
  16. 素描初习(一)---三棱锥
  17. 该如何选择手机群控系统,小白必看,防进深坑。
  18. echarts,柱状图配置,legend
  19. 广东省城市环境空气质量状况数据集(2014年1月-2022年5月)
  20. 十进制转换为二进制(java)

热门文章

  1. php开发我的收藏,我的收藏列表 · 老猫带你玩转ThinkPHP5 API开发 · 看云
  2. Mapoutputcollector的几个方法
  3. 分享我的Linux开发环境
  4. python项目实战:实现数据可视化三维拟合
  5. python中根据字符串导入模块module
  6. 用 Node.js 把玩一番 Alfred Workflow
  7. 跟KingDZ学HTML5之九 HTML5新的 Input 种类
  8. EXCEL 2010学习笔记—— 动态图表
  9. Linux下处理BOM头和^M的简单方法
  10. CakePHP 2.x CookBook 中文版 第三章 入门(三)