Сделать мое приложение автоматически выполненным во время перезагрузки.
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, означают в обслуживании единицу?
Примечание: Старое сообщение было записано в контексте исходного вопроса 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
как первая строка.
Это не вопрос полномочий. Нет просто никакой оболочки, вовлеченной в выполнение эти ExecStart
строка. Только команда и опции, которые будут переданы той команде, но ни перенаправления, ни передача по каналу, ни concatening с ;
, ни замена или любая другая функциональность оболочки. Таким образом Ваши "перенаправления" передаются как опции Вашему приложению (только Вы знаете, как Ваше приложение обрабатывает это).
можно изменить это путем вызова оболочки и предоставления команды и перенаправлений как командная строка к оболочке. Это - то, что -c
делает опция.
, Но думают о, почему бы не использовать сервисы и регистрирующийся, как предназначено systemd: По умолчанию stdout и stderr systemd единицы отправляются в системный журнал. Можно настроить его с StandardOutput=
строка в сервисе. Взгляните на man systemd.exec
перезагрузка демона 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