Лучше не редактировать эти файлы, а делать так называемые оверрайды.
systemctl edit apache2
systemctl cat apache2
Команда systemctl edit apache2 создаст /etc/systemd/system/apache2.service.d/override.conf
и сама выполнит systemctl daemon-reload.
Комнада systemctl cat apache2 покажет из каких файлов собран apache2.service, т.к. в каталоге /etc/systemd/system/apache2.service.d/ могут быть и другие файлы.
Плюсы в том, что дистрибутивный файл будет обновляться и не будет терять изменения, при обновлениях.
Прежде всего нужно упомянуть что службы Systemd можно разделить на две категории. Первая категория — это системные службы, которые запускаются от имени суперпользователя. Для управления такими службами нужно использовать sudo. Вторая категория — пользовательские службы, которые запускаются от имени определённого пользователя и этот же пользователь имеет над ними полный контроль без необходимости использовать sudo.
Файлы системных служб находятся в таких каталогах:
- /usr/lib/systemd/system
- /lib/systemd/system
- /etc/systemd/system
Файлы пользовательских служб можно найти в таких каталогах:
- /usr/lib/systemd/user
- /lib/systemd/user
- /etc/systemd/user
- $USER/.config/systemd/user
Причём файлы сервисов поставляемые с пакетами, как правило, располагаются в каталогах /lib и /usr/lib, а в /etc/ расположены модифицированные файлы юнитов переопределяющие стандартные настройки. Вы можете прочитать более подробно об управлении службами в Linux в статье Управление службами в Linux.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Об авторе
Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.
You could do this (using nullmailer as an example):
systemctl show nullmailer | grep FragmentPath | awk -F'=' '{print $2}'
That will produce something like this:
/lib/systemd/system/nullmailer.service
Then to see the service file content, you could do this:
cat $(systemctl show nullmailer | grep FragmentPath | awk -F'=' '{print $2}')
And that would produce something like this:
[Unit]
Description=nullmailer
[Unit]
Description=Nullmailer relay-only MTA
... stuff omitted for brevity ...
[Install]
WantedBy=multi-user.target
Hope it helps.
PS. I typically put those commands in an alias file just for convenience.
P.PS. As Joaquin mentioned, you can use the -P flag instead of using the grep|awk combo I was using/mentioning.
systemctl show nullmailer -P FragmentPath
I have a windows service and I need to create directory to store some info. The directory path must be relative to the windows service exe file.
How can get this exe file path ?
asked May 14, 2010 at 12:09
3
answered May 14, 2010 at 12:10
IncognitoIncognito
16.6k9 gold badges52 silver badges74 bronze badges
6
Tip: If you want to find startup path of installed windows service, look here from registry .
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservices + ServiceName
There are keys about windows service
answered Sep 3, 2013 at 12:36
1
Instead of using a directory relative to the executable, and therefore needing admin privileges, why not use the common application data directory, which is accessible through
Environment.GetFolderPath(SpecialFolder.CommonApplicationData)
This way your app doesn’t need write access to its own install directory, which makes you more secure.
answered May 14, 2010 at 12:13
StewartStewart
3,95817 silver badges20 bronze badges
2
Try this
System.Reflection.Assembly.GetEntryAssembly().Location
answered May 27, 2013 at 5:59
ramin eftekhariramin eftekhari
3,1652 gold badges17 silver badges28 bronze badges
1
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe);
svchost.exe is the executable which runs your service which is in system32. Hence we need to get to the module which is being run by the process.
davervw
1711 silver badge5 bronze badges
answered May 14, 2010 at 12:58
SachinSachin
8826 silver badges7 bronze badges
1
The default directory for a windows service is the System32 folder. In your service, though, you can change the current directory to the directory that you specified in the service installation by doing the following in your OnStart:
// Define working directory (For a service, this is set to System)
// This will allow us to reference the app.config if it is in the same directory as the exe
Process pc = Process.GetCurrentProcess();
Directory.SetCurrentDirectory(pc.MainModule.FileName.Substring(0, pc.MainModule.FileName.LastIndexOf(@"")));
Edit: an even simpler method (but I haven’t tested yet):
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
answered May 14, 2010 at 12:19
derekderek
4,8261 gold badge23 silver badges26 bronze badges
1
This did the trick for me
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
IKavanagh
5,99911 gold badges41 silver badges47 bronze badges
answered Apr 25, 2018 at 7:57
Danw25Danw25
3062 silver badges13 bronze badges
This will return you the correct path even if running under LocalSystem account which defaults to system32:
System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);
answered Mar 3, 2021 at 10:59
MecanikMecanik
1,5111 gold badge19 silver badges45 bronze badges
If you want to get access of Program Files folder or any other using programming you should use the below code which is provide rights to specific folder.
private bool GrantAccess(string fullPath)
{
DirectoryInfo dInfo = new DirectoryInfo(fullPath);
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
dInfo.SetAccessControl(dSecurity);
return true;
}
answered Feb 21, 2018 at 12:45
Ebg TestEbg Test
911 silver badge11 bronze badges
3
Не удается открыть файл .SERVICE? Вам интересно, что в нем содержится? На нашем сайте мы объясним вам, что это за файл, для чего он используется и какая программа открывает файл .SERVICE.
Расширение файла .SERVICE создано Леннартом Поттерингом и Кей Сиверс. .SERVICE классифицируется как системные файлы.
Файл SERVICE — это файл сервисного модуля, включенный в systemd, систему инициализации (инициализации), используемую различными дистрибутивами Linux для загрузки пользовательского пространства и управления процессами. Он содержит информацию о том, как управлять серверным приложением или службой, в том числе о том, как запускать или останавливать службу и когда она должна запускаться автоматически.
Система инициализации systemd — это набор программ, включенных в различные дистрибутивы Linux. Система используется для управления различными аспектами сервера. Юнит — это ресурс, которым systemd может оперировать и управлять. Каждый модуль имеет файл конфигурации, известный как файл модуля. Суффикс файла устройства указывает, для какого типа устройства в файле хранится информация о конфигурации.
Файлы юнитов systemd по умолчанию расположены в следующем каталоге:
/lib/системд/система
Файлы модулей systemd, созданные или настроенные системным администратором, расположены в следующем каталоге:
/etc/системд/система/
Если вы хотите отредактировать файл модуля SERVICE, не редактируйте файл SERVICE напрямую в каталоге. Вместо этого вы должны скопировать файл, отредактировать копию, а затем переопределить исходный файл SERVICE.
ПРИМЕЧАНИЕ: systemd загружается многими дистрибутивами Linux, включая Red Hat, Arch Linux, Fedora, CentOS, Ubuntu, Mageia, CoreOS и Alpine Linux.