, Как установить переменную окружения в systemd сервисе

Просмотрите fstat и lsof из портов/ пакетов .

Установка lsof (PKG_PATH зависит от версии ОС):

$ su - root -c \
    "PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/5.8/packages/amd64 pkg_add -r lsof"
lsof-4.88: ok

Использование fstat :

# Start a process (nc) that listens on port 8080
$ nc -l 8080 & bg
[1] 17454
[1] nc -l 8080

# Get the process listening on port 8080:
$ fstat | grep :8080
cmihai   nc         17454    3* internet stream tcp 0x0 *:8080

Мы можем создать функцию для получения pid, например:

$ portpid() { fstat | grep ":$1" | awk '{print $3}' ;}
$ portpid 8080
17454

Тогда мы можем убить процесс, прослушивающий порт 8080, как это:

$ kill $(portpid 8080)
[1] + Terminated           nc -l 8080

Отказ от ответственности:

  • В этом примере НЕТ обработки ошибок или что-либо еще - и я не Проверьте это самостоятельно и добавьте некоторые обработки ошибок к этой функции, чтобы избежать уничтожения другого процесса по ошибке.

Ссылка:

-121--128451-

Вы можете закольцевать его:

echo  here is a pat and a tern and a pattern     |
sed  -e'1{H;x;s/\(.\).*/\1pattern\1replace/;x;}' \
-eG  -e'/\(.*\)\(.*\n\)\(\n\1\)\n/!{P;d;}'       \
     -e's//\3\2/;t-'                             \
-e:- -e's/\(\n\)\(.\)\(.*\n\)\(.\)/\4\1\3/;t-'   \
     -e's/\n//;P;d'

here is a pat and a tern and a replace

Это делает заменяющий символ, проходя слева направо. Он сдвигает первый разделитель справа от заменяемого символа для каждой подстановки. Вы можете видеть, что я имею в виду, если воткнуть команду l ook непосредственно перед циклом t ested подмены после -e: - :


here is a pat and a tern and a \npattern\nreplace$
here is a pat and a tern and a r\nattern\neplace$
here is a pat and a tern and a re\nttern\nplace$
here is a pat and a tern and a rep\ntern\nlace$
here is a pat and a tern and a repl\nern\nace$
here is a pat and a tern and a repla\nrn\nce$
here is a pat and a tern and a replac\nn\ne$
here is a pat and a tern and a replace\n\n$
here is a pat and a tern and a replace

Если вы действительно ищете своего рода перевод вещи, вы можете сделать это тоже. Я написал это ранее в качестве ответа на другой вопрос:

Это выглядит выполнимо - вы просто должны как бы сдвиг в/сдвиг:

 эхо может cccc ccccccclayii sed глины игнорировать\
каждая вещь cclayii, кроме соответствующего слова\
- cclayiicclayii |
sed -e 'y//\n/'\
-eh -e/\( cclayii\)\1 */&/g; x; s///g; s/^//'\
-ex -e//./; s/\( [^] * *\)\{ 2\}/\1/g; s/^//'\
-e 'y/clayk/kieio/; G; t $' -e: $\
-e '/^\n/{ s///; y/\n/\n/;} '\
-et -e 's/^ *\( [^] *\)\(. *\n [^] *\)/\2\1/; t $'

 может ли ccccc cccccckkieiii sed глина игнорировать каждую kkieiii вещь, но соответствующее слово - kkieiiikkieiii

... это непросто, хотя.

Эта петля тоже немного, но не так много.

Как и в случае наиболее сложных проблем, способ проще, если вы используете два sed s:

 echo может cccc ccccccclayii sed clay игнорировать\
каждая вещь cclayii, кроме соответствующего слова\
- cclayiicclayii |
sed -e 's/\( cclayii\)\1 */\n &\n/g; G; s/^//' |
sed -e '/^/! y/clayk/kieio/;/./{ H; d;} '\
-e 'x; s/\n\{ 0,1\}//g'

 может ccccc cccccckkieiii sed глина игнорировать каждую kkieiii вещь, но соответствующее слово - kkieiiikkieiii

С BSD sed вы хотите использовать литеральную новую строку вместо n в \n побегов в правой подстановке для первого sed там.

-121--289170-

Это произошло со мной, когда у меня был файл конфигурации VirtureHost в пользовательском каталоге/etc/httpd/sites-enabled, который был поверх Прослушивание 80

Происходит так, что, прослушивая этот порт на httpd.conf, он конфликтует, что приводит к этой ошибке. Удаление нескольких записей на Listen 80 и наличие только одной записи на httpd.conf позволяет решить эту проблему. При создании виртуальных хостов, прослушивающих порты, а не домены, я всегда включаю их в верхнюю часть виртуального хоста.conf-файл Прослушайте номер 12345 , соответствующий соответствующему порту.

10
14.07.2018, 09:40
2 ответа

Обычно systemdслужбы имеют только ограниченный набор переменных окружения, и вещи в связанных файлах /etc/profile, /etc/profile.dиbashrc-не установлены.

Чтобы добавить переменные окружения для службы systemd, у вас есть разные возможности.

В приведенных ниже примерах предполагается, что roscoreнаходится в /opt/ros/kinetic/bin/roscore, поскольку systemdслужбы должны иметь двоичный файл или сценарий, настроенный с полным путем.


Одна из возможностей — использовать опцию Environmentв службе systemd. Простая служба systemdвыглядит следующим образом.

[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service

[Service]
Type=simple
Environment="One=1" "Three=3"
Environment="Two=2"
Environment="Four=4"
ExecStart=/opt/ros/kinetic/bin/roscore

[Install]
WantedBy=multi-user.target

Вы также можете поместить все переменные среды в файл, который можно прочитать с помощью опции EnvironmentFileв службе systemd.

[root@localhost ~]# cat /etc/systemd/system/ros.env
One=1
Three=3
Two=2
Four=4


[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service

[Service]
Type=simple
EnvironmentFile=/etc/systemd/systemd/ros.env
ExecStart=/opt/ros/kinetic/bin/roscore

[Install]
WantedBy=multi-user.target

Другим вариантом может быть создание сценария-оболочки для вашего двоичного файла rosи вызов этого сценария-оболочки из службы systemd. Скрипт должен быть исполняемым. Чтобы убедиться в этом, запустите

chmod 755 /opt/ros/kinetic/bin/roscore.startup

после создания этого файла.

[root@localhost ~]# cat /opt/ros/kinetic/bin/roscore.startup
#!/bin/bash

source /opt/ros/kinetic/setup.bash
roscore


[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service

[Service]
Type=simple
ExecStart=/opt/ros/kinetic/bin/roscore.startup

[Install]
WantedBy=multi-user.target

Обратите внимание, что вам нужно запустить systemctl daemon-reloadпосле того, как вы отредактировали файл службы, чтобы сделать изменения активными. Чтобы включить службу при загрузке системы, вам нужно ввести systemctl enable ros.

Я не знаком с двоичным файлом roscore, и может потребоваться изменить Type=с simple(, который используется по умолчанию и обычно не требуется )на forkingв первых двух примерах.


Для обычного входа в систему вы можете скопировать или создать символическую ссылку /opt/ros/kinetic/setup.bashна /etc/profile.d/ros.sh, которая должна быть получена при обычном входе в систему.

44
27.01.2020, 20:00

вы можете попробовать это

[Unit]
Description=Run command with source /opt/ros/kinetic/setup.bash

[Service]
Type=simple
ExecStart=/bin/bash -c 'source /opt/ros/kinetic/setup.bash && /opt/ros/kinetic/bin/roscore'

[Install]
WantedBy=multi-user.target
1
15.09.2020, 02:31

Теги

Похожие вопросы