Используя systemctl-редактирование через bash-скрипт?

Что ж, вам не нужно иметь две отдельные команды find :

find abc -type f -exec sed -n 's/test/best/pg' {} + -exec sed -i 's/test/best/g' {} +

... и вы этого не сделаете необходимо ./ перед abc .

3
02.08.2018, 01:39
5 ответов

Вы можете переопределить переменную среды$SYSTEMD_EDITOR, чтобы использовать другую команду, отличную от вашего редактора, при запуске systemctl edit.

Например, использование чего-то вроде SYSTEMD_EDITOR='cp /path/to/source.file', кажется, работает нормально (, хотя это довольно уродливо, ожидая, что туда будет добавлен последний аргумент systemd!)

Для вашего конкретного случая вы можете использовать:

$ { echo "[Service]"; 
    echo "ExecStartPre=/bin/sleep 5";
  } >~/tmp/sddm-override.conf
$ sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm

Но все, что на самом деле делает systemctl edit, — это создает файл переопределения (в своем случае с именемoverride.conf)в каталоге /etc/systemd/system/<service>.service.d/, который создается, если он не существует... Так что делать это напрямую — это также вполне приемлемый подход. (См. упоминания о "вставить -" и "переопределить" на справочной странице для systemd.unit для более подробной информации.)

Итак, в вашем случае это было бы подходящим решением:

$ sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]"; 
    echo "ExecStartPre=/bin/sleep 5";
  } | sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ sudo systemctl daemon-reload

Который помещает файл с ожидаемым содержимым в каталог «drop -in» для вашего устройства, и в этом случае вы также можете назвать его соответствующим образом в соответствии с тем, что он пытается выполнить.

ОБНОВЛЕНО:Как указывает @GracefulRestart, вам нужен systemctl daemon-reloadпосле добавления капли -напрямую.

11
27.01.2020, 21:10

Я хочу повторить ответ, данный в 3 , но я делаю это таким образом, используя тройник

env SYSTEMD_EDITOR=tee  sudo -E systemctl edit --system [your_unit_name] < [your_content_file]

Делая это таким образом, вы можете передавать содержимое через стандартный ввод, а не из файла, что может быть полезно при вызове systemctl из скрипта.

1
27.01.2020, 21:10

Я бы атаковал файл напрямую:

sed -i 's/\[Service]/ a\
ExecStartPre=/bin/sleep 5' /usr/lib/systemd/system/sddm.service
-3
27.01.2020, 21:10

Поскольку я еще не нашел, как использовать systemctl editв скрипте, лучше всего было бы смоделировать команду systemctl edit sddmи поместить переопределение в каталог /etc/systemd/system, а служебные единицы — в /usr. /lib/systemd/system может быть изменен при обновлении пакетов:

UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload

Это должно быть примерно эквивалентно тому, что делает systemctl edit sddm.

5
27.01.2020, 21:10

Вы можете изменить то, что редакторsystemctl(8)использует для своей подкомандыeditс помощью переменной SYSTEMD_EDITOR. По сути, это создает команду, последним аргументом которой всегда является systemctl(8)созданный временный файл, в который после записи он перемещается в override.conf.

Из-за этого мы можем использоватьtee(1)как SYSTEMD_EDITOR, а затем перенаправить любой текст, который мы хотим, из оболочки на всю команду systemctl(8)на стандартном вводе. Например, перенаправление здесь -документа:

SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF

Это создает папку -в файле /etc/systemd/system/ssdm.service.d/override.confс содержимым между «словами» EOF.

Под -капотом -подкоманда editвыглядит примерно так:

# Create drop-in directory for service
mkdir -p /etc/systemd/system/ssdm.service.d

# Create empty temporary file
touch /etc/systemd/system/ssdm.service.d/.

# Pass temporary file as last argument of SYSTEMD_EDITOR
tee /etc/systemd/system/sddm.service.d/.\#override.conf846580011dbe64db/.\#override.conf846580011dbe64db<<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF

# Rename temporary file
mv /etc/systemd/system/sddm.service.d/{.\#override.conf846580011dbe64db,override.conf}

После редактирования юнита конфигурация systemd перезагружается автоматически (способом, эквивалентнымdaemon-reload).

5
01.03.2020, 19:11

Теги

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