最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用C#編寫(xiě)Linux守護(hù)進(jìn)程實(shí)例代碼

 更新時(shí)間:2018年01月31日 08:48:05   作者:Chaunce  
如今的編程是一場(chǎng)程序員和上帝的競(jìng)賽,程序員要開(kāi)發(fā)出更大更好、傻瓜都會(huì)用到軟件,下面這篇文章主要給大家介紹了關(guān)于利用C#編寫(xiě)Linux守護(hù)進(jìn)程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

前言

Linux守護(hù)進(jìn)程是Linux的后臺(tái)服務(wù)進(jìn)程,相當(dāng)于Windows服務(wù),對(duì)于為L(zhǎng)inux開(kāi)發(fā)服務(wù)程序的朋友來(lái)說(shuō),Linux守護(hù)進(jìn)程相關(guān)技術(shù)是必不可少的,因?yàn)檫@個(gè)技術(shù)不僅僅是為了開(kāi)發(fā)守護(hù)進(jìn)程,還可以拓展到多進(jìn)程,父子進(jìn)程文件描述符共享,父子進(jìn)程通訊、控制等方面,是實(shí)現(xiàn)Linux大型服務(wù)的基礎(chǔ)技術(shù)之一。

如果要在Red Hat Enterprise Linux上將.NET Core進(jìn)程作為后臺(tái)進(jìn)程運(yùn)行,則可以創(chuàng)建自定義systemd單元。今天我將為.NET Core編寫(xiě)兩個(gè)自定義系統(tǒng)單元的例子。一個(gè)是運(yùn)行.NET Core控制臺(tái)應(yīng)用程序的一種類(lèi)型,另一個(gè)是運(yùn)行ASP.NET Core Web應(yīng)用程序的簡(jiǎn)單類(lèi)型。

控制臺(tái)應(yīng)用程序

建立一個(gè)應(yīng)用程序

您可以用dotnet run在systemd中使用指定項(xiàng)目目錄作為工作目錄。但是,我們來(lái)構(gòu)建一個(gè)二進(jìn)制文件并將其用于systemd。用dotnet new 命令創(chuàng)建您的項(xiàng)目后編輯Program.cs如下。

using System;
using System.IO;
namespace ConsoleApplication
{
 public class Program
 {
  public static void Main(string[] args)
  {
   var path = Path.GetTempFileName();
   File.WriteAllText(path, "Hello Temp File!");
   Console.WriteLine($"Wrote temp file: {path}");
  }
 }
}

然后用dotnet publish命令發(fā)布項(xiàng)目。你會(huì)看到bin/<Configuration>/<Framework>目錄下的二進(jìn)制文件。

$ dotnet publish -c Release
Publishing ConsoleApp for .NETCoreApp,Version=v1.1
Project ConsoleApp (.NETCoreApp,Version=v1.1) was previously compiled. Skipping compilation.
publish: Published to /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/ConsoleApp/bin/Release/netcoreapp1.1/publish
Published 1/1 projects successfully

創(chuàng)建一個(gè)自定義的systemd

首先,創(chuàng)建一個(gè)運(yùn)行守護(hù)進(jìn)程和工作目錄的用戶。

$ sudo useradd -s /sbin/nologin dotnetuser
$ sudo mkdir /var/SystemdExample
$ sudo cp /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/ConsoleApp/bin/Release/netcoreapp1.1/publish/* /var/SystemdExample
$ sudo chown -R dotnetuser:dotnetuser /var/SystemdExample

然后在/etc/systemd/system/目錄下創(chuàng)建一個(gè)自定義的systemd單元文件。文件名應(yīng)該是<unit-name>.<unit-type>。我創(chuàng)建的目錄和文件名為:/etc/systemd/system/netcore-console-example.service。

[Unit]
Description=Example for .NET Core ConsoleApp with systemd
DefaultDependencies=no
 
[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dll
WorkingDirectory=/var/SystemdExample
User=dotnetuser
Group=dotnetuser
 
 
[install]

您應(yīng)該在ExecStart中指定dotnet的完整路徑。以上是紅帽提供的.NET Core 1.1的情況。然后你可以用systemctl命令執(zhí)行守護(hù)進(jìn)程。您可以使用systemctl status命令或journalctl命令查看控制臺(tái)輸出。

$ sudo systemctl start netcore-console-example.service
$ sudo systemctl status netcore-console-example.service
● netcore-console-example.service - Example for .NET Core ConsoleApp with systemd
 Loaded: loaded (/etc/systemd/system/netcore-console-example.service; enabled; vendor preset: disabled)
 Active: inactive (dead) since Fri 2017-02-24 00:29:16 JST; 13s ago
 Process: 18075 ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dll (code=exited, status=0/SUCCESS)
 Main PID: 18075 (code=exited, status=0/SUCCESS)
 
Feb 24 00:29:16 localhost.localdomain systemd[1]: Starting Example for .NET Core ConsoleApp with systemd...
Feb 24 00:29:16 localhost.localdomain dotnet[18075]: Wrote temp file: /tmp/tmph1ok6H.tmp
Feb 24 00:29:16 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd.
 
$ journalctl -u netcore-console-example.service -e
Feb 24 00:29:16 localhost.localdomain systemd[1]: Starting Example for .NET Core ConsoleApp with systemd...
Feb 24 00:29:16 localhost.localdomain dotnet[18075]: Wrote temp file: /tmp/tmph1ok6H.tmp
Feb 24 00:29:16 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd.
$ sudo cat /tmp/tmph1ok6H.tmp
Hello Temp File!

使用PrivateTemp

在上述系統(tǒng)單元中,程序在臨時(shí)文件夾下寫(xiě)入一個(gè)文件。你有時(shí)想寫(xiě)一個(gè)來(lái)自其他用戶的臨時(shí)文件是安全的。您可以在[Service]section中的指定使用PrivateTemp。

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dll
WorkingDirectory=/var/SystemdExample
User=dotnetuser
Group=dotnetuser
PrivateTemp=true

重新加載單元文件后,程序可以像前一樣訪問(wèn)/tmp目錄,但這不是實(shí)際的/tmp目錄。

$ sudo systemctl daemon-reload 
$ sudo systemctl start netcore-console-example.service
$ sudo systemctl status netcore-console-example.service
● netcore-console-example.service - Example for .NET Core ConsoleApp with systemd
 Loaded: loaded (/etc/systemd/system/netcore-console-example.service; enabled; vendor preset: disabled)
 Active: inactive (dead) since Fri 2017-02-24 00:35:46 JST; 12s ago
 Process: 18415 ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet ConsoleApp.dll (code=exited, status=0/SUCCESS)
 Main PID: 18415 (code=exited, status=0/SUCCESS)
 
Feb 24 00:35:46 localhost.localdomain systemd[1]: Starting Example for .NET Core ConsoleApp with systemd...
Feb 24 00:35:46 localhost.localdomain dotnet[18415]: Wrote temp file: /tmp/tmpJLWAGC.tmp
Feb 24 00:35:46 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd.
$ ls /tmp/tmpJLWAGC.tmp
ls: cannot access /tmp/tmpJLWAGC.tmp: No such file or directory

Web應(yīng)用程序

建立一個(gè)應(yīng)用程序

現(xiàn)在我們來(lái)構(gòu)建一個(gè)ASP.NET Core Web應(yīng)用程序。今天我使用默認(rèn)的模板項(xiàng)目。

$ dotnet new -t web
Created new C# project in /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/WebApp.
$ dotnet restore 
** snipped**
log : Restore completed in 9721ms.
$ dotnet publish -c Release
Publishing WebApp for .NETCoreApp,Version=v1.1
** snipped **
publish: Published to /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/WebApp/bin/Release/netcoreapp1.1/publish
Published 1/1 projects successfully

現(xiàn)在可以用dotnet命令運(yùn)行。

$ dotnet bin/Release/netcoreapp1.1/publish/WebApp.dll 
info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
  User profile is available. Using '/home/tatanaka/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
Hosting environment: Production
Content root path: /home/tatanaka/Documents/git/tanaka-takayoshi/SystemdExample/1.1/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

創(chuàng)建一個(gè)自定義的systemd

為這個(gè)Web應(yīng)用程序也指定dotnetuser名稱(chēng)。

$ sudo mkdir /var/SystemdExample
$ sudo cp -R bin/Release/netcoreapp1.1/publish/* /var/SystemdWebExample
$ sudo chown -R dotnetuser:dotnetuser /var/SystemdWebExample

然后創(chuàng)建一個(gè)自定義的systemd單元文件/etc/systemd/system/netcore-web-example.service。

[Unit]
Description=Example for .NET Core WebApp with systemd
DefaultDependencies=no
Wants=network.target # network is required
After=network.target
 
[Service]
ExecStart=/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet WebApp.dll
WorkingDirectory=/var/SystemdWebExample
Restart=always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=dotnetuser
Group=dotnetuser
PrivateTmp=true
Environment=ASPNETCORE_ENVIRONMENT=Production # specify environment variable for environment
Environment=ASPNETCORE_URLS=http://*:8080 # specify environement variable for listening port
 
[Install]
WantedBy = multi-user.target

最后,您可以將ASP.NET Core應(yīng)用程序作為L(zhǎng)inux守護(hù)程序運(yùn)行。請(qǐng)注意,此應(yīng)用程序偵聽(tīng)端口8080代替了ASP.NET Core 默認(rèn)的 5000,因?yàn)槲以贏SPNETCORE_URLS單元文件中指定了環(huán)境變量  。

$ systemctl start netcore-web-example.service
[tatanaka@localhost WebApp]$ systemc^C
[tatanaka@localhost WebApp]$ sudo systemctl status netcore-web-example.service
[sudo] password for tatanaka: 
● netcore-web-example.service - Example for .NET Core WebApp with systemd
 Loaded: loaded (/etc/systemd/system/netcore-web-example.service; disabled; vendor preset: disabled)
 Active: active (running) since Sat 2017-02-25 01:02:12 JST; 11s ago
 Main PID: 7041 (dotnet)
 CGroup: /system.slice/netcore-web-example.service
   └─7041 /opt/rh/rh-dotnetcore11/root/usr/bin/dotnet WebApp.dll
 
Feb 25 01:02:12 localhost.localdomain systemd[1]: Started Example for .NET Core WebApp with systemd.
Feb 25 01:02:12 localhost.localdomain systemd[1]: Starting Example for .NET Core WebApp with systemd...
Feb 25 01:02:12 localhost.localdomain dotnet-example[7041]: info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
Feb 25 01:02:12 localhost.localdomain dotnet-example[7041]: User profile is available. Using '/home/dotnetuser/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
Feb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Hosting environment: Production
Feb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Content root path: /var/SystemdWebExample
Feb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Now listening on: http://*:8080
Feb 25 01:02:13 localhost.localdomain dotnet-example[7041]: Application started. Press Ctrl+C to shut down.
 
$ journalctl -u netcore-web-example -xf
-- Logs begin at Mon 2017-02-20 11:58:31 JST. --
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[2]
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Sending file. Request path: '/images/banner4.svg'. Physical path: '/var/SystemdWebExample/wwwroot/images/banner4.svg'
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Request finished in 0.1973ms 200 image/svg+xml
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Request starting HTTP/1.1 GET http://localhost:8080/favicon.ico
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[2]
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Sending file. Request path: '/favicon.ico'. Physical path: '/var/SystemdWebExample/wwwroot/favicon.ico'
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Feb 25 01:02:36 localhost.localdomain dotnet-example[7041]: Request finished in 0.5824ms 200 image/x-icon

然而這對(duì)于ASP.NET Core的生產(chǎn)使用來(lái)說(shuō)是不夠的。你可能需要設(shè)置一個(gè)反向代理服務(wù)器,比如Jexus,nginx,防火墻等等。

Writing a Linux daemon in C#

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 關(guān)于C#基礎(chǔ)知識(shí)回顧--反射(一)

    關(guān)于C#基礎(chǔ)知識(shí)回顧--反射(一)

    其實(shí)說(shuō)白了,反射就是能知道我們未知類(lèi)型的類(lèi)型信息這么一個(gè)東西.沒(méi)什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運(yùn)行時(shí)得到類(lèi)型信息
    2013-07-07
  • C#轉(zhuǎn)換日期類(lèi)型實(shí)例

    C#轉(zhuǎn)換日期類(lèi)型實(shí)例

    這篇文章主要介紹了C#轉(zhuǎn)換日期類(lèi)型的方法,以實(shí)例形式分析了將日期格式轉(zhuǎn)換為Unix時(shí)間戳與時(shí)區(qū)結(jié)合的形式,是比較實(shí)用的技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 基于C#實(shí)現(xiàn)屏幕錄制功能

    基于C#實(shí)現(xiàn)屏幕錄制功能

    在許多應(yīng)用場(chǎng)景中,屏幕錄制是一項(xiàng)非常有用的功能,不管是用于教學(xué)、演示、故障排查還是游戲錄制,本文將詳細(xì)介紹如何使用?C#?實(shí)現(xiàn)屏幕錄制功能,幫助大家快速掌握這一實(shí)用技能,需要的朋友可以參考下
    2025-03-03
  • C#通過(guò)HttpWebRequest發(fā)送帶有JSON Body的POST請(qǐng)求實(shí)現(xiàn)

    C#通過(guò)HttpWebRequest發(fā)送帶有JSON Body的POST請(qǐng)求實(shí)現(xiàn)

    本文主要介紹了C#通過(guò)HttpWebRequest發(fā)送帶有JSON Body的POST請(qǐng)求實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#給Excel添加水印實(shí)例詳解

    C#給Excel添加水印實(shí)例詳解

    這篇文章主要介紹了C#給Excel添加水印實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • C#讀寫(xiě)配置文件方式(config.ini)入門(mén)

    C#讀寫(xiě)配置文件方式(config.ini)入門(mén)

    這篇文章主要介紹了C#讀寫(xiě)配置文件方式(config.ini)入門(mén),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • c# 9.0新特性nint和Pattern matching的使用方法

    c# 9.0新特性nint和Pattern matching的使用方法

    這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細(xì)致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下
    2020-06-06
  • C#實(shí)現(xiàn)圖形路徑變換的方法

    C#實(shí)現(xiàn)圖形路徑變換的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)圖形路徑變換的方法,涉及C#針對(duì)圖形路徑的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • c# 可選參數(shù)、命名參數(shù)

    c# 可選參數(shù)、命名參數(shù)

    設(shè)計(jì)一個(gè)方法的參數(shù)的時(shí),可為部分或全部參數(shù)分配默認(rèn)值。調(diào)用其方法時(shí),可以重新指定分配了默認(rèn)值的參數(shù),也可以使用默認(rèn)值
    2012-10-10
  • C#實(shí)現(xiàn)鼠標(biāo)拖拽無(wú)邊框浮動(dòng)窗體的方法

    C#實(shí)現(xiàn)鼠標(biāo)拖拽無(wú)邊框浮動(dòng)窗體的方法

    一般情況下,在標(biāo)題欄中按住鼠標(biāo)左鍵不放即可實(shí)現(xiàn)拖動(dòng)操作,當(dāng)做浮動(dòng)窗體時(shí),如果包含窗體邊框,那么界面給使用者的感覺(jué)將很不友好,因此本文給大家介紹了C#實(shí)現(xiàn)鼠標(biāo)拖拽無(wú)邊框浮動(dòng)窗體的方法,感興趣的朋友可以參考下
    2024-04-04

最新評(píng)論

嫩江县| 太保市| 库车县| 饶阳县| 岫岩| 泌阳县| 瑞金市| 通许县| 岢岚县| 芦山县| 靖边县| 十堰市| 连州市| 常德市| 天祝| 崇仁县| 集安市| 涪陵区| 保靖县| 鄱阳县| 六枝特区| 嵊州市| 宝坻区| 鄂托克旗| 阿坝| 鄯善县| 霍林郭勒市| 昌吉市| 泾阳县| 兰坪| 镇远县| 新乐市| 威信县| 普洱| 聊城市| 元谋县| 辽中县| 思南县| 忻州市| 北京市| 大荔县|