真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何利用C#編寫Linux守護進程

這篇文章給大家分享的是有關(guān)如何利用C#編寫Linux守護進程的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

新絳ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

前言

Linux守護進程是Linux的后臺服務進程,相當于Windows服務,對于為Linux開發(fā)服務程序的朋友來說,Linux守護進程相關(guān)技術(shù)是必不可少的,因為這個技術(shù)不僅僅是為了開發(fā)守護進程,還可以拓展到多進程,父子進程文件描述符共享,父子進程通訊、控制等方面,是實現(xiàn)Linux大型服務的基礎(chǔ)技術(shù)之一。

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

控制臺應用程序

建立一個應用程序

您可以用dotnet run在systemd中使用指定項目目錄作為工作目錄。但是,我們來構(gòu)建一個二進制文件并將其用于systemd。用dotnet new 命令創(chuà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ā)布項目。你會看到bin//目錄下的二進制文件。

$ 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)建一個自定義的systemd

首先,創(chuàng)建一個運行守護進程和工作目錄的用戶。

$ 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)建一個自定義的systemd單元文件。文件名應該是.。我創(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]

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

$ 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/tmph2ok6H.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/tmph2ok6H.tmp
Feb 24 00:29:16 localhost.localdomain systemd[1]: Started Example for .NET Core ConsoleApp with systemd.
$ sudo cat /tmp/tmph2ok6H.tmp
Hello Temp File!

使用PrivateTemp

在上述系統(tǒng)單元中,程序在臨時文件夾下寫入一個文件。你有時想寫一個來自其他用戶的臨時文件是安全的。您可以在[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

重新加載單元文件后,程序可以像前一樣訪問/tmp目錄,但這不是實際的/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應用程序

建立一個應用程序

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

$ 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命令運行。

$ 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)建一個自定義的systemd

為這個Web應用程序也指定dotnetuser名稱。

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

然后創(chuàng)建一個自定義的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應用程序作為Linux守護程序運行。請注意,此應用程序偵聽端口8080代替了ASP.NET Core 默認的 5000,因為我在ASPNETCORE_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

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

Writing a Linux daemon in C#

感謝各位的閱讀!關(guān)于“如何利用C#編寫Linux守護進程”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!


分享題目:如何利用C#編寫Linux守護進程
鏈接地址:http://weahome.cn/article/jdchgs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部