Systemd සේවාවේ පරිසර විචල්‍යය සකසන්නේ කෙසේද?


192

මට systemd සමඟ ආරුක්කු ලිනක්ස් පද්ධතියක් ඇති අතර මම මගේම සේවාවක් නිර්මාණය කර ඇත්තෙමි. වින්‍යාස කිරීමේ සේවාව මේ /etc/systemd/system/myservice.serviceවගේ ය:

[Unit]
Description=My Daemon

[Service]
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

දැන් මට පරිසර විචල්‍ය කට්ටලයක් ලබා ගැනීමට අවශ්‍යයි /bin/myforegroundcmd. මම කොහොමද ඒක කරන්නේ?

Answers:


239

කාලය වෙනස් වන අතර හොඳම පුරුදු කරන්න.

මෙය කිරීමට දැනට ඇති හොඳම ක්‍රමය වන්නේ ධාවනය කිරීමයි systemctl edit myservice, එය ඔබ වෙනුවෙන් අභිබවා යන ගොනුවක් සාදනු ඇත හෝ පවතින එකක් සංස්කරණය කිරීමට ඔබට ඉඩ දෙයි.

සාමාන්‍ය ස්ථාපනයන්හිදී මෙය නාමාවලියක් නිර්මාණය කරනු ඇති අතර /etc/systemd/system/myservice.service.d, එම නාමාවලිය තුළ .conf(සාමාන්‍යයෙන්, override.conf) අවසන් වන ගොනුවක් සාදනු ඇති අතර, මෙම ගොනුවේ ඔබට බෙදා හැරීම මඟින් නැව්ගත කරන ලද ඒකකයේ ඕනෑම කොටසක් එකතු කිරීමට හෝ අභිබවා යා හැකිය.

උදාහරණයක් ලෙස, ගොනුවක /etc/systemd/system/myservice.service.d/myenv.conf:

[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"

නාමාවලිය පවතින අතර හිස් නම් ඔබේ සේවාව අක්‍රීය වනු ඇති බව සලකන්න. ඔබ ඩිරෙක්ටරියට යමක් දැමීමට අදහස් නොකරන්නේ නම්, එය නොපවතින බවට වග බලා ගන්න.


යොමුව සඳහා, පැරණි ක්‍රමය වූයේ:

මෙය කිරීමට නිර්දේශිත ක්‍රමය/etc/sysconfig/myservice වන්නේ ඔබේ විචල්‍යයන් අඩංගු ගොනුවක් නිර්මාණය කර ඒවා පටවන්න EnvironmentFile.

සම්පූර්ණ විස්තර සඳහා, පද්ධතිමය පිටපතක් ලිවිය යුතු ආකාරය පිළිබඳ ෆෙඩෝරාගේ ලියකියවිලි බලන්න .


4
මම හිතන්නේ sysconfigමාර්ගය ෆෙඩෝරාට විශේෂිත නමුත් ප්‍රශ්නය වන්නේ ආර්ච් ලිනක්ස් ගැන ය. පලුහ්ගේ පිළිතුර වඩාත් සිත්ගන්නා සුළු යැයි මම සිතමි
ලුඩොවික් කුටි

1
/etc/sysconfigෆෙඩෝරා විශේෂිත වේ. AFAIR Arch Linux /etcඑම ෆෙඩෝරා විශේෂිත ස්ථානයට වඩා වින්‍යාස ගොනු පැකේජයට විශේෂිත තැනක තබා ගැනීමට පෙළඹී සිටියේය . වැනි /etc/myservice.conf, අතිරේක ගොනුව භාවිතා වුවත් මෙහි නිවැරදි මාර්ගය බවක් පෙනෙන්නට නැත.
මයිකල් ගෝර්නි

5
නෑ නෑ නෑ. / etc / sysconfig නැවත නිර්දේශ නොකෙරේ. ඩෙබියන් වෙතින් / etc / default / * සමඟ එය අධෛර්යමත් වේ, මන්ද ඒවා අර්ථ විරහිත වන අතර නම් අර්ථ විරහිත වන අතර පසුගාමී අනුකූලතා හේතූන් මත පමණක් අර්ථවත් කරයි (සියල්ලම / etc යනු පද්ධතියේ වින්‍යාසය ගැන මිස / etc / sysconfig, සහ / etc / defaults යනු පෙරනිමි සඳහා මිස පෙරනිමි සඳහා නොවේ). නිර්වචන සෘජුවම ඒකක ගොනුවට දමන්න, නැතහොත් එය කළ නොහැකි නම්, පැකේජයට නිශ්චිත ස්ථානයක් ඇති පාරිසරික ගොනුවක (මිචාගේ ප්‍රකාශය යෝජනා කරන පරිදි).
zbyszek

1
RedFrederickNord එය හුදෙක් විචල්ය = අගය යුගල, එනම් DJANGO_SETTINGS_MODULE=project.settingsඑක් පේළියකට එකක් වැනි ය .
මයිකල් හැම්ප්ටන්

2
Ic මයිකල්හැම්ප්ටන් කරුණාකර "වර්තමාන හොඳම ක්‍රමය" සඳහා ප්‍රලේඛන සබැඳියක් එක් කළ හැකිද?
jb.

82

පිළිතුර රඳා පවතින්නේ විචල්‍යය නියත විය යුතුද (එනම්, පරිශීලකයා ඒකකය ලබා ගැනීමෙන් වෙනස් කළ යුතු නොවේ) හෝ විචල්‍යය (පරිශීලකයා විසින් සැකසිය යුතුය) යනුවෙනි.

එය ඔබගේ දේශීය ඒකකය බැවින්, මායිම තරමක් බොඳ වී ඇති අතර දෙයාකාරයෙන්ම ක්‍රියා කරයි. කෙසේ වෙතත්, ඔබ එය බෙදා හැරීමට පටන් ගෙන එය අවසන් /usr/lib/systemd/systemවුවහොත් මෙය වැදගත් වනු ඇත.

නියත වටිනාකම

එක් අවස්ථාවකට අගය වෙනස් කිරීමට අවශ්‍ය නොවන්නේ නම්, වඩාත් කැමති ක්‍රමය එය Environment=සෘජුවම ඒකක ගොනුවේ තැබීමයි:

[Unit]
Description=My Daemon

[Service]
Environment="FOO=bar baz"
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

එහි ඇති වාසිය නම් විචල්‍යය ඒකකය සමඟ තනි ගොනුවක තබා ගැනීමයි. එබැවින්, ඒකක ගොනුව පද්ධති අතර ගමන් කිරීම පහසුය.

විචල්ය අගය

කෙසේ වෙතත්, සයිසැඩ්මින් විසින් පාරිසරික විචල්‍යයේ වටිනාකම දේශීයව වෙනස් කළ යුතු යැයි සිතන විට ඉහත විසඳුම හොඳින් ක්‍රියාත්මක නොවේ. වඩාත් නිශ්චිතවම, ඒකක ගොනුව යාවත්කාලීන කරන සෑම අවස්ථාවකම නව අගය සැකසිය යුතුය.

මෙම අවස්ථාව සඳහා, අතිරේක ගොනුවක් භාවිතා කළ යුතුය. කෙසේද - සාමාන්‍යයෙන් බෙදා හැරීමේ ප්‍රතිපත්තිය මත රඳා පවතී.

විශේෂයෙන් සිත්ගන්නා විසඳුමක් වන්නේ /etc/systemd/system/myservice.service.dනාමාවලිය භාවිතා කිරීමයි . වෙනත් විසඳුම් මෙන් නොව, මෙම නාමාවලිය systemd විසින්ම සහාය දක්වන අතර එම නිසා බෙදා හැරීමේ විශේෂිත මාර්ග නොමැත.

මෙම අවස්ථාවේදී, ඔබ /etc/systemd/system/myservice.service.d/local.confඒකක ගොනුවේ නැතිවූ කොටස් එකතු කරන ගොනුවක් තබයි :

[Service]
Environment="FOO=bar baz"

පසුව, systemd සේවාව ආරම්භ කරන විට ගොනු දෙක ඒකාබද්ධ කරයි ( systemctl daemon-reloadඒවායින් එකක් වෙනස් කිරීමෙන් පසුව මතක තබා ගන්න ). මෙම මාර්ගය systemd විසින් කෙලින්ම භාවිතා කරන බැවින්, ඔබ මේ EnvironmentFile=සඳහා භාවිතා නොකරයි .

බලපෑම වෙනස් කළ යුත්තේ සමහර බලපෑමට ලක්වූ පද්ධති මත පමණක් නම්, ඔබට විසඳුම් දෙකම ඒකාබද්ධ කළ හැකිය, පෙරනිමිය කෙලින්ම ඒකකයේ සහ අනෙක් ගොනුවේ දේශීය පෙරළියක් සපයයි.


systemctl daemon-reloadsystemd නැවත පූරණය කිරීමේ විධානයයි
දිමිත්‍රි බුසොලින්

1
EnvironmentFile=අගයන් මුරපද වැනි රහස් වන විට වඩා හොඳය. විස්තර සඳහා මගේ පිළිතුර බලන්න.
දොන් කිර්ක්බි


19

විසින් පිළිතුරු මයිකල් හා මයිකල් ප්රයෝජනවත් වන අතර systemd සේවාව සඳහා පරිසර විචල්ය සකස් කර ගන්නේ කෙසේද කියා මුල් ප්රශ්නයට පිළිතුරු. කෙසේ වෙතත්, පරිසර විචල්‍යයන් සඳහා වන එක් පොදු භාවිතයක් නම්, ඔබගේ යෙදුමේ කේතය සමඟ අහම්බෙන් ප්‍රභව පාලනයට බැඳී නොසිටින ස්ථානයක මුරපද වැනි සංවේදී දත්ත වින්‍යාස කිරීමයි.

ඔබේ සේවාවට පරිසර විචල්‍යයක් ලබා දීමට ඔබට අවශ්‍ය වන්නේ එබැවිනි , ඒකක වින්‍යාස ගොනුවේ භාවිතා නොකරන්නEnvironment= . EnvironmentFile=සේවා ගිණුමට පමණක් කියවිය හැකි වෙනත් වින්‍යාස ගොනුවකට එය යොමු කර යොමු කරන්න (සහ root ප්‍රවේශය ඇති පරිශීලකයින්).

මෙම විධානය ඇති ඕනෑම පරිශීලකයෙකුට ඒකක වින්‍යාස ගොනුවේ විස්තර දැකිය හැකිය:

systemctl show my_service

මම වින්‍යාස ගොනුවක් /etc/my_service/my_service.confතබා මගේ රහස් එහි තැබුවෙමි .

MY_SECRET=correcthorsebatterystaple

මගේ සේවා ඒකක ගොනුවේ, මම භාවිතා කළේ EnvironmentFile=:

[Unit]
Description=my_service

[Service]
ExecStart=/usr/bin/python /path/to/my_service.py
EnvironmentFile=/etc/my_service/my_service.conf
User=myservice

[Install]
WantedBy=multi-user.target

ps auxeඑම පරිසර විචල්‍යයන් නොපෙනෙන බව මම පරීක්ෂා කළ අතර අනෙක් පරිශීලකයින්ට ප්‍රවේශයක් නොමැත /proc/*/environ. ඇත්ත වශයෙන්ම, ඔබේම පද්ධතිය පරීක්ෂා කරන්න.


8

මයිකල් එක් පිරිසිදු විසඳුමක් ලබා දුන් නමුත් මට අවශ්‍ය වූයේ ස්ක්‍රිප්ට් වෙතින් යාවත්කාලීන කළ env විචල්‍යය ලබා ගැනීමටය. අවාසනාවකට, basd විධාන ක්‍රියාත්මක කිරීම systemd ඒකක ගොනුවේ කළ නොහැක. වාසනාවකට ඔබට ExecStart තුළ bash අවුලුවාලිය හැකිය:

http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service&sect=5

මෙම සැකසුම ෂෙල් විධාන රේඛාවලට සෘජුවම සහාය නොදක්වන බව සලකන්න. ෂෙල් විධාන රේඛා භාවිතා කිරීමට නම් ඒවා කිසියම් ආකාරයක ෂෙල් ක්‍රියාත්මක කිරීමකට පැහැදිලිවම යැවිය යුතුය.

අපගේ නඩුවේ උදාහරණය නම්:

[Service]
ExecStart=/bin/bash -c "ENV=`script`; /bin/myforegroundcmd"

7
මෙය විවිධ හේතු නිසා ක්‍රියා නොකරනු ඇත (එය “එක පහරක්” සේවාවක් මිස අර්ථ විරහිත). පහත සඳහන් දෑ වැඩ කිරීමට මට හැකි විය : /bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'. මෙම -aපරිසරය උප ක්රියාවලිය වලට අපනයනය කරයි සහතික (ඔබ සියලු විචල්යයන් උපසර්ගය කිරීමට අවශ්ය නම් whateverසමඟ export)
Otheus

එය ක්‍රියා නොකරන්නේ ඇයි? එය සෑම විටම ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම ඇතුළුව සම්පූර්ණ විධානයම ක්‍රියාත්මක කළ යුතුය, එසේ නොවේ ද?
user1830432

සමහර විට ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmdමෙම නඩුවේ ටිකක් හොඳ විසඳුමක් විය හැකිය.
kstep

@Otheus: නියම පිළිතුර, මට ටොම්කාට් 8 ඒකක ගොනුවක් සෑදීමට සිදු වූ විට දවසින් දවස සුරකින ලදි.
ඩැනියෙල්

1
Systemd සේවා ගොනුවක් "in" හි bash විධානයක් ක්‍රියාත්මක කිරීමට ක්‍රමයක් තිබේ. මෙම සබැඳිය බලන්න: coreos.com/os/docs/latest/…
මාර්ක් ලකාටා
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.