Чтобы автозапуск приложения во время перезагрузки.
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 touch /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
Почему у root нет разрешения на запись журнала в /var/log/app.log?
Чтобы изменить инструкцию ExecStart в
ExecStart=/bin/sh -c '/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1'
Проблема решена. 1.Почему root не имеет права записывать запись в /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.
Вот почему оболочка необходима для всей команды, так что перенаправление может работать. Что касается флага f6 для оболочки, см. Старую версию сообщения ниже.
ПРИМЕЧАНИЕ
Флаг -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 в качестве первой строки.
ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.
Ключевая проблема здесь в том, что
ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1
Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.
Вот почему оболочка необходима для всей команды, так что перенаправление может работать. Что касается флага f6 для оболочки, см. Старую версию сообщения ниже.
ПРИМЕЧАНИЕ
Флаг -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 в качестве первой строки.
ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.
Ключевая проблема здесь в том, что
ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1
Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.
Вот почему оболочка необходима для всей команды, так что перенаправление может работать. Что касается флага f6 для оболочки, см. Старую версию сообщения ниже.
ПРИМЕЧАНИЕ
Флаг -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 в качестве первой строки.
ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.
Ключевая проблема здесь в том, что
ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1
Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.
Вот почему оболочка необходима для всей команды, так что перенаправление может работать. Что касается флага f6 для оболочки, см. Старую версию сообщения ниже.
ПРИМЕЧАНИЕ
Флаг -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 просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).
Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.
Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки 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 daemon-reload sudo systemctl enable app.service
Поиск журнала приложения с помощью команды журнала .
sudo journalctl -u app
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 daemon-reload sudo systemctl enable app.service
Поиск журнала приложения с помощью команды журнала .
sudo journalctl -u app
Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).
Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.
Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки 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 daemon-reload sudo systemctl enable app.service
Поиск журнала приложения с помощью команды журнала .
sudo journalctl -u app
Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).
Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.
Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки 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 daemon-reload sudo systemctl enable app.service
Поиск журнала приложения с помощью команды журнала .
sudo journalctl -u app
Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).
Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.
Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки StandardOutput= в своей службе. Посмотрите на man systemd.exec