Что делает/bin/bash-c, означают в обслуживании единицу?

Сделать мое приложение автоматически выполненным во время перезагрузки.

sudo vi /etc/systemd/system/app.service

[Unit]
Description=app
After=network.target

[Service]
ExecStart=/usr/bin/python /usr/local/bin/app  
[Install]
WantedBy=multi-user.target


sudo systemctl daemon-reload
sudo systemctl enable app.service

Теперь мое приложение, автоматически выполненное во время перезагрузки.
Я хочу заставить свое приложение записать всю информацию о выводе в /var/log/app.log.
Вот то, что я делаю.
1.sudo касаются /var/log/app.log
2. изменить ExecStart только.

ExecStart=/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

Приложение может работать, но никакой журнал, записанный в /var/log/app.log.
Корень выполнит приложение.
Это - доказательство здесь.

ps aux|grep  app
root       246  0.0  3.8  56052 10056 ?        Ss   00:57   0:00 /usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

Почему корень не имеет никакого разрешения записать, входят в /var/log/app.log?

Изменить оператор ExecStart в

ExecStart=/bin/sh -c '/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1'  

Проблема решена.
1. Почему корень никакое разрешение записать входит в /var/log/app.log?
2. Что делает/bin/bash-c, означают в обслуживании единицу?

5
задан 4 May 2017 в 17:50

3 ответа

Примечание: Старое сообщение было записано в контексте исходного вопроса OP, перед редактированием, таким образом, это неполно, но в контексте того, что было первоначально, был спрошен, это все еще допустимо.

Обновленный ответ:

Ключевой вопрос здесь - это

ExecStart=/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

Не имеет выполнения оболочки, таким образом, Ваш > и 2>&1 перенаправление не будет понято под systemd.

Вот почему оболочка необходима вокруг целой команды так, чтобы перенаправление могло работать. Что касается -c флаг для оболочки, посмотрите старую версию сообщения ниже.


СТАРОЕ СООБЩЕНИЕ

-c флаг в обоих bash и sh среднее то же самое: выполните команды как предусмотрено в кавычках. Нет никакой большой тайны.

Ваше приложение, которое Вы пытаетесь запустить, могло бы иметь другое значение для флага-c, не предполагайте, что все флаги командной строки являются тем же для всех команд. Без документации для приложения трудно сказать то, что опция, как предполагается, делает.

Потенциальная проблема здесь - то, что интерпретатор Python примет-c как свой собственный параметр командной строки, не к приложению. Вероятно, это - главная причина Ваши сбои команды.

ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json должен смочь обработать Вашу команду. Я протестировал его с маленьким сценарием:

$ cat test_script.py
import sys
print sys.argv[1],sys.argv[0]
$ python test_script.py this is a test                
this test_script.py

Лучший подход: сценарий должен быть сделан исполняемым файлом с sudo chmod +x /usr/local/bin/app и используемый отдельно. Путем это записано первоначально с/bin/sh, затем Python, затем называя фактический сценарий довольно избыточен. В примере моего сценария тестирования, который был бы похож так:

$ cat test_script.py                                  
#!/usr/bin/env python
import sys
print sys.argv[1],sys.argv[0]
$ chmod +x test_script.py
$ ./test_script.py this is a test
this ./test_script.py

Остерегайтесь этого python обращается к Python 2.7 на Ubuntu. Если необходимо использовать Python3 а именно, используйте/usr/bin/python3 вместо этого. Большая часть предпочтительного пути состоит в том, чтобы приложение имело #!/usr/bin/env python или #!/usr/bin/env python3 как первая строка.

2
ответ дан 23 November 2019 в 09:12

Это не вопрос полномочий. Нет просто никакой оболочки, вовлеченной в выполнение эти ExecStart строка. Только команда и опции, которые будут переданы той команде, но ни перенаправления, ни передача по каналу, ни concatening с ;, ни замена или любая другая функциональность оболочки. Таким образом Ваши "перенаправления" передаются как опции Вашему приложению (только Вы знаете, как Ваше приложение обрабатывает это).

можно изменить это путем вызова оболочки и предоставления команды и перенаправлений как командная строка к оболочке. Это - то, что -c делает опция.

, Но думают о, почему бы не использовать сервисы и регистрирующийся, как предназначено systemd: По умолчанию stdout и stderr systemd единицы отправляются в системный журнал. Можно настроить его с StandardOutput= строка в сервисе. Взгляните на man systemd.exec

3
ответ дан 23 November 2019 в 09:12

перезагрузка демона sudo vi/etc/systemd/system/app.service

[Unit]
Description=app
After=network.target

[Service]
ExecStart=/usr/bin/python /usr/local/bin/app  
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target

sudo systemctl
sudo systemctl позволяет app.service

искать журнал приложения с командой журнала.

sudo journalctl  -u  app
1
ответ дан 23 November 2019 в 09:12

Другие вопросы по тегам:

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