我需要在嵌入式系统上以最低Ubuntu安装方式运行.net C#应用程序(在Windows系统上开发)作为服务/守护程序(不包括X,除服务器外SSH,只有相关的软件)。我创建了一个/etc/init.d脚本,其中包含该行以非root用户身份在linux中运行mono-service

mono-service my-.net-app.exe service

并且工作良好。还有交互式启动应用程序(用于调试)选项与

mono my-.net-app.exe interactive

最后一个参数是告诉它,如果它是作为服务运行的.NET应用程序的参数。这是大致这种方式实现:

private static void Main(string[] args){

if(args.Any() && args[0] != null && args[0] == "service"){

ServiceBase.Run(new[] {(ServiceBase) new MyService()});

}else{

try{

Console.Write("starting app");

if(StartWork()){

Console.Write("press any key to exit");

Console.ReadKey();

}else{

Console.WriteLine("starting app failed");

}

} // end try

finally{

StopWork();

Console.WriteLine("finished app");

}

} // end else

...

} // end Main

public class MyService : ServiceBase{

static private Thread _worker;

protected override void OnStart(string[] args){

_worker = new Thread(() => Program.StartWork(asService: true)); // this asService tells StartWork to not produce console output

_worker.Start();

}

protected override void OnStop(){

Program.StopWork();

_worker.Join(1000);

}

}

这种实现的目的是允许应用程序(即,执行StopWork())于Linux机器上发送SIGTERM正常死亡。

出于安全原因,我需要能够以非root用户身份运行该服务。我创建了一个新用户,并使其成为应用程序写入其日志文件的目录的所有者,并将其添加到各个组以允许其访问所需的设备文件。然后,根将启动应用程序作为

sudo -u newuser mono-service my-.net-app.exe service

sudo -u newuser mono my-.net-app.exe interactive

mono与第二个选择的效果很好,但第一个与mono-service不(见下文错误消息)。由于它与mono一起使用,我相信用户newuser具有访问所有相关文件和设备的适当权限。我想知道mono-service是否被设想为仅限于根的应用程序。

我也可以住在一起使用mono选项,并抑制控制台输出,就像这样:

private static void Main(string[] args){

try{

Console.Write("starting app");

if(StartWork(consoleoutput)){ // true or false depending on whether the service argument was given

Console.Write("press any key to exit");

Console.ReadKey();

}else{

Console.WriteLine("starting app failed");

}

} // end try

finally{

StopWork();

Console.WriteLine("finished app");

}

...

} // end Main

但后来,当我杀死服务(即发送SIGTERM到mono过程),它停止.net应用程序,而不允许它执行finally块。

最后,我的问题是否有人知道为什么mono-service在没有以root身份启动时失败。错误消息如下,正如我前面提到的,当我使用mono而不是mono-service时,它不存在。

ERROR Program [4] [15:03:06.795 01/12/14] Error in Main!

FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

---> NHibernate.HibernateException: Could not create the driver from SAFEmine.DataStore.Database.MonoSqliteDriver, SAFEmine.DataStore, Version=1.3.0.6, Culture=neutral, PublicKeyToken=null. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> NHibernate.HibernateException: The IDbCommand and IDbConnection implementation in the assembly Mono.Data.Sqlite could not be found. Ensure that the assembly Mono.Data.Sqlite is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use element in the application configuration file to specify the full name of the assembly.

at NHibernate.Driver.ReflectionBasedDriver..ctor (System.String providerInvariantName, System.String driverAssemblyName, System.String connectionTypeName, System.String commandTypeName) [0x00000] in :0

at NHibernate.Driver.ReflectionBasedDriver..ctor (System.String driverAssemblyName, System.String connectionTypeName, System.String commandTypeName) [0x00000] in :0

at SAFEmine.DataStore.Database.MonoSqliteDriver..ctor() [0x00000] in :0

at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&)

at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00000] in :0

或者,如果我满足于mono代替mono-service,有没有办法从.NET应用程序中,并优雅地死抓SIGTERM?我试过这个:https://github.com/ServiceStack/ServiceStack/wiki/Run-ServiceStack-as-a-daemon-on-Linux,但是代码不会在Visual Studio上编译,说这个using Mono.Unix;和using Mono.Unix.Native行是无效的。我还在Windows上安装了Mono,并试图使用Mono编译器,但它抱怨同样的事情。

+1

'Mono.Unix'在[Mono.Posix.dll](http://stackoverflow.com/a/8408723/85785)中。 –

2014-12-01 17:15:02

linux以非root身份运行,以非root用户身份在linux中运行mono-service相关推荐

  1. linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?

    linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...

  2. linux 安装simg2img,linux可执行文件执行时提示No such file or directory(docker环境中运行的ubuntu镜像)...

    linux下在转换system.img文件类型时,提示 首先进入到了可执行文件所在目录下,并将system.img也放在同一目录下: 查看文件信息,可以看到文件是存在的,并且是可以执行的. 于是执行如 ...

  3. c语言如何运行txt文件,如何使用EOF在C中运行文本文件?

    如何检测EOF取决于您用来读取流的内容: function                  result on EOF or error --------                  ---- ...

  4. Linux命令之su -- 用于切换当前用户身份到其他用户身份

    文章目录 命令介绍 特别重要 常用选项 su 命令存在的安全隐患 参考示例 切换成指定的用户身份,但是环境变量不变 切换成指定的用户身份,并且改成对应用户的环境变量 切换成指定的用户,并告知新的 sh ...

  5. linux ftp查看用户目录权限,linux 指定ftp用户 特定目录及权限

    Linux添加FTP用户并设置权限 在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户: ...

  6. Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...

    前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pi ...

  7. zkeacms mysql_在Docker中运行纸壳CMS并配置使用MySql

    纸壳CMS是基于ASP .Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. 方式一 直接运行以下命令即可在docker中运行纸 ...

  8. 构建具有用户身份认证的 Ionic 应用

    序言:本文主要介绍了使用 Ionic 和 Cordova 开发混合应用时如何添加用户身份认证.教程简易,对于 Ionic 入门学习有一定帮助.因为文章是去年发表,所以教程内关于 Okta 的一些使用步 ...

  9. 使用 K3d 在 Docker 中运行 Kubernetes 集群

    K3d是一个围绕 Rancher/SUSE K3s Kubernetes 发行版的开源包装器,可让您在 Docker 中运行控制平面.整个堆栈在 Docker 中运行,为您提供轻量级且易于设置的完全容 ...

  10. pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...

    我正在从n个页面的输入pdf文件中读取特定位置,并在这些位置上列出文本. 然后,我编写一个新的pdf文档,并将列表中的这些字符串写入包含单元格的表中. 我提出了两个主要问题. 我想在表中有三列,但是如 ...

最新文章

  1. Mac OS X 下连接CMCC无法弹出登陆页面问题
  2. Redis 官方可视化工具,功能强大、干净又卫生!
  3. Python 3.3.2 中文版
  4. uva10954 - Add All(multiset功能)
  5. 电脑设置 win10 文件夹如何设置黑色描边?文件夹图片如何显示缩略图?
  6. 数据库事务及隔离级别
  7. 前端学习(1819):前端面试题之封装函数之冒泡排序
  8. Java常用设计模式————工厂模式
  9. 按照顺序执行_问一个多线程的问题:如何才能保证线程有序执行?
  10. Define a New Server 没有tomcat选项
  11. 协程(Python)
  12. php ipa 版本定制,class.php
  13. 分享PHP多功能在线工具箱网站源码,安装教程详解
  14. sap erp 消息服务器,九慧信息|SAP_SAP ERP_SAP系统_SAP s/4hana
  15. 计算机技能名称英语,电脑技能英文表示法
  16. 计算机对体育专业就业前景,体育教育就业方向及就业前景分析
  17. ”父母子女身高“数据集(高尔顿数据集)进行线性回归分析实验
  18. 15 个常用的python 开源框架
  19. 微软研发中心招聘的背后
  20. 【动态规划dp】青蛙的烦恼(frog)

热门文章

  1. 一文读懂TOF深度相机技术原理--TI-Tintin-OPT8241二次开发和应用系列--Theory Level
  2. hdu_5701_中位数计数
  3. 安卓实现记住密码登陆功能
  4. HttpClient基础教程
  5. 39.什么是操作系统(os)
  6. Lintcode 569解题思路及c++代码
  7. 计算机视觉:值得一读的五本计算机视觉教科书
  8. 单片机利用蜂鸣器如何输出音乐
  9. php留言簿代码,php自治简单留言板代码
  10. mysql 未能启用约束_未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。...