.NET跨平台实践:用C#开发Linux守护进程(转)
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作。
一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的。
Daemon程序一般用c/c++开发。不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#!
一,创建Daemon程序:
用VS新建一个控制台项目,假设名称是MyDaemon,输入下边的代码:

using System.Runtime.InteropServices;
using System.Threading; namespace MyDaemon
{
class Program
{
static void Main(string[] args)
{
int pid = fork();
if (pid != 0) exit(0); //设置“会话组长”,与父进程脱离
setsid(); pid = fork();
if (pid != 0) exit(0); //已经进程“守护进程”工作状态了! //关闭所有打开的文件描述符
int max = open("/dev/null", 0);
for (var i = 0; i <= max; i++) { close(i); } //重设文件掩模
umask(0); //执行你的程序过程
DaemonMain(args);
} /// <summary>
/// Daemon工作状态的主方法
/// </summary>
/// <param name="aargs"></param>
static void DaemonMain(string[] aargs)
{ //你的工作代码...
//daemon时,控制台输入输出流已经关闭
//请不要再用Console.Write/Read等方法
//阻止daemon进程退出
while (true)
{ Thread.Sleep(1000); }
} [DllImport("libc", SetLastError = true)]
static extern int fork(); [DllImport("libc", SetLastError = true)]
static extern int setsid(); [DllImport("libc", SetLastError = true)]
static extern int umask(int mask); [DllImport("libc", SetLastError = true)]
static extern int open([MarshalAs(UnmanagedType.LPStr)]string pathname, int flags); [DllImport("libc", SetLastError = true)]
static extern int close(int fd); [DllImport("libc", SetLastError = true)]
static extern int exit(int code);
}
}

然后编译为 MyDaemon.exe。
二,部署和运行:
.net 程序在linux运行,一般都会使用mono这个.net框架,不过,为了简单方便,我这里使用 AnyExec来运行这个程序(关于AnyExec,请参阅:不装mono,你的.NET程序照样可以在Linux上运行!)。
1,把 MyDeamon.exe放到anyexec的app文件夹;
2,把 "any"这个程序复制为 MyDeamon;
3,运行:见证神奇的时间到了!请你在linux控制终端上输入: ./MyDaemon,哈哈,怎么没有反应? 其实,不是没有反应,是你这个 MyDaemon程序已经在后台跑起来了!
输入 “ps -ef”,看看!

看到那个 MyDaemon了吧!这次运行的PID是11618,父进程是的PID是1,1是谁?linux init!
4,退出daemon程序:daemon程序不会与控制台输入输出进行交互,所以,用Console.ReadLine之类的方法控制进程的退出是不现实的。那么,怎么关闭这个在后台运行的 daemon呢? 最简办法就是用ps -ef查出这个进程的PID号,然后用kill命令终止它。比如当前运行的这个 mydaemon的PID号是 11618,你只需要输入 kill -9 11618,就能终止它的运行。
(本文转自:http://www.cnblogs.com/yunei/p/5352944.html)
.NET跨平台实践:用C#开发Linux守护进程(转)的更多相关文章
- .NET跨平台实践:再谈用C#开发Linux守护进程
Linux守护进程是Linux的后台服务进程,相当于Windows服务进程,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是开发守护进程,还可以拓展 ...
- .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇
Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...
- C#开发Linux守护进程
用C#开发Linux守护进程 Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- .NET跨平台实践:用C#开发Linux守护进程-Daemon
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
之前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程>和<.NET跨平台实践:再谈用C#开发Linux守护进程 - 完 ...
- [转]❲阮一峰❳Linux 守护进程的启动方法
❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...
- Server Develop (七) Linux 守护进程
守护进程 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装 ...
- 笔记整理--Linux守护进程
Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...
随机推荐
- 一个简单的makefile
#common makefile header LOCAL_INCLUDE := \ -I/xxx/ACE/ACE/ LOCAL_FLAGS := $(LOCAL_INCLUDE) LIBS := - ...
- IT人 转型
IT人 转型 转自: http://blog.sina.com.cn/s/blog_88534dff0101232b.html “35岁,技术生涯即告终结.”这种说法在it界得到众多人认可, ...
- NC 单据保存时间过长,判断数据库锁表解决办法
SELECT s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$session s WHERE l.object_id = o.o ...
- 纯CSS实现Tooltip
DEMO: span{ position:relative; display:inline-block; height:3em; width:3em; margin:0 0.4em; line-hei ...
- VS2012智能提示消失的解决方法
1.点击电脑左下角的“开始菜单”->"所有程序"->Microsoft Visual Studio 2012->Visual Studio Tools->V ...
- C# 反转字符串方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 反转字符 ...
- 编辑器sublime text3和插件package control、Sidebar Enhancements插件安装
(1)编辑器sublime text3的安装:选择自己需要的版本下载安装:http://www.sublimetext.com/3 (2)package control插件安装:https://pac ...
- hdoj 1272 小希的迷宫
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- nginx负载均衡最新
配置conf文件 #user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log no ...
- [转]redis-cli的一些有趣也很有用的功能
本文转至:http://www.tuicool.com/articles/Yvqm2ev http://mdba.cn/category/redis/ redis-cli我们最常用的两个参数就是-h. ...