LINUX.ORG.RU
ФорумAdmin

tmux + cron

 , ,


0

2

Не запускается в кроме сервис memogram

запуск из консоли работает, скрипт рабочий, не понимаю чего выделывается tmux

то есть судя по логу сессия запускается, но видимо cron ее захлапывает

# crontab -e
@reboot sleep 15 && /opt/telegram-integration/start.sh
# cat /opt/telegram-integration/start.sh |grep -v ^#

/bin/sleep 5

source $HOME/.bashrc
source $HOME/.profile

SESSION_NAME=Telegram-Integration
/usr/bin/tmux set-option  -g  default-shell /bin/bash
/usr/bin/tmux new-session -ds $SESSION_NAME "source $HOME/.bashrc; source $HOME/.profile; cd /opt/telegram-integration; ./memogram"
echo "3" >> /tmp/tmux.out
echo `tmux ls` >> /tmp/tmux.out
sleep 3
echo `tmux ls` >> /tmp/tmux.out
# cat /tmp/tmux.out
3
Telegram-Integration: 1 windows (created Wed Jun 5 16:45:08 2024)
Telegram-Integration: 1 windows (created Wed Jun 5 16:45:08 2024)

Сам скрипт запущенный из консоли все запускает и работает Уже не знаю куда копать захожу по ssh, смотрю от root-а, а сессий tmux-а нет

# tmux ls
no server running on /tmp/tmux-0/default

# ps ax|grep tmux
  18452 pts/1    S+     0:00 grep --color=auto tmux

Перемещено hobbit из general


Сам скрипт запущенный из консоли все запускает и работает

// Да сколько ж вам всем объяснять-то…

Сравни вывод /usr/bin/env (без аргументов) из крона и в интерактивной сессии.

mord0d ★★★★★
()

Возможно, tmux не находит $TERM, а он ему нужен. Попробуй добавить в скрипт свой export TERM=rxvt-unicode, или что там у тебя (echo $TERM просто в терминале). Хотя для новой сессии не должно быть… Но кто его знает. По крайней мере, я с таким как-то сталкивался.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от mord0d
# cat /tmp/tmux.env
SHELL=/bin/sh LANGUAGE=en_US:en PWD=/root LOGNAME=root HOME=/root LANG=en_US.UTF-8 SHLVL=0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin _=/usr/bin/env

Все в одну строку блин

# cat /tmp/tmux.env_console
SHELL=/bin/bash
SUDO_GID=1000
LANGUAGE=en_US:en
SUDO_COMMAND=/bin/bash
SUDO_USER=as1000
PWD=/root
LOGNAME=root
HOME=/root
LANG=en_US.UTF-8
LS_COLORS=...................
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
SHLVL=1
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
SUDO_UID=1000
MAIL=/var/mail/root
_=/usr/bin/env

А вот больше похоже на правду какого черта он окружение не берет source /root/.profile и судя по логу и команде tmux ls он создает и видит сессию и она работает, а а по ssh я ее уже не вижу

VecH
() автор топика
Последнее исправление: VecH (всего исправлений: 1)
Ответ на: комментарий от CrX
# cat /opt/telegram-integration/start.sh
#!/bin/bash
# Cron + tmux statup script
# Approach was taken from http://www.nburles.co.uk/linux/starting-a-process-in-a-tmux-session-using-cron

# Sleep for 5 seconds. If you are starting more than one tmux session
#   "at the same time", then make sure they all sleep for different periods
#   or you can experience problems
/bin/sleep 5

echo $TERM > /tmp/tmux.out
echo `/usr/bin/env` > /tmp/tmux.env
# Ensure the environment is available
source $HOME/.bashrc
source $HOME/.profile

echo "--" >> /tmp/tmux.out
echo $TERM >> /tmp/tmux.out

SESSION_NAME=Telegram-Integration
/usr/bin/tmux set-option  -g  default-shell /bin/bash
# Run bash without command
/usr/bin/tmux new-session -ds $SESSION_NAME "source $HOME/.bashrc; source $HOME/.profile; cd /opt/telegram-integration; ./memogram"
echo "3" >> /tmp/tmux.out
echo `tmux ls` >> /tmp/tmux.out
sleep 3
echo `tmux ls` >> /tmp/tmux.out
# cat /tmp/tmux.out
dumb
--
xterm-256color
3
Telegram-Integration: 1 windows (created Wed Jun 5 20:47:27 2024)
Telegram-Integration: 1 windows (created Wed Jun 5 20:47:27 2024)

Смотрю что там в $TERM, какой то dumb

Но подгружается окружение root-а и $TERM становится нормальным и после этого запускается tmux, только почему то cron его вышибает

source $HOME/.bashrc
source $HOME/.profile

Как запустить tmux с логом в файл? (беглый гугл показывает что там все очень заморочено)

VecH
() автор топика
Ответ на: комментарий от VecH

Как запустить tmux с логом в файл? (беглый гугл показывает что там все очень заморочено)

tmux pipe-pane -t <pane> 'cat >> pane.log'

OFFTOP:

Кажется, что тут нагромождение костылей какое-то. Может проще написать systemd unit? Там и окружением можно управлять и логи сразу будут.

Или memogram (Кстати, что это?) без tty отказывается работать?

Belkrr
()
Ответ на: комментарий от VecH

Все в одну строку блин

Проблемы с $TERM?

какого черта он окружение не берет source /root/.profile

Запусти свой скрипт от целевого юзера с аргументом -x (/bin/sh -x /path/to/your/script.sh) и посмотри что оно делает построчно.

судя по логу и команде tmux ls он создает и видит сессию и она работает, а а по ssh я ее уже не вижу

🤷 Кот его знает… pgrep -fal tmux что говорит? Может оно отработало и завершилось?

mord0d ★★★★★
()
Ответ на: комментарий от Belkrr
# cat /etc/systemd/system/tmux_master.service
[Unit]
Description=tmux master service

[Service]
Type=forking
User=root
ExecStart=/usr/bin/tmux new-session -s master -d
ExecStop=/usr/bin/tmux kill-session -t master

[Install]
WantedBy=multi-user.target
# cat /etc/systemd/system/tmux_telememos.service
[Unit]
Description=tmux telegram-Integration service
PartOf=tmux_master.service
After=tmux_master.service

[Service]
Type=oneshot
RemainAfterExit=yes
User=root
ExecStart=/usr/bin/tmux new-session -s telegram-Integration -d "source /root/.bashrc; source /root/.profile; cd /opt/telegram-integration; ./memogram"
ExecStop=/usr/bin/tmux kill-session -t telegram-Integration

[Install]
WantedBy=multi-user.target
# cat /etc/systemd/system/tmux_test2.service
[Unit]
Description=tmux test 2 service
PartOf=tmux_master.service
After=tmux_master.service

[Service]
Type=oneshot
RemainAfterExit=yes
User=root
ExecStart=/usr/bin/tmux new-session -s test2 -d
ExecStop=/usr/bin/tmux kill-session -t test2

[Install]
WantedBy=multi-user.target
# tmux ls
master: 1 windows (created Thu Jun  6 19:52:54 2024)
test2: 1 windows (created Thu Jun  6 19:52:54 2024)
# journalctl -u tmux_telememos.service
-- Boot 89ae884043144604a3454b0a960936e9 --
Jun 06 19:52:54 vps01 systemd[1]: Starting tmux telegram-Integration service...
Jun 06 19:52:54 vps01 systemd[1]: Finished tmux telegram-Integration service.

Попробовал через systemd, получаю какую то фигу у этого memogram никаких логов нет, спросил на github, жду ответа

При запуске с консоли все в порядке

# systemctl restart tmux_telememos.service
# tmux ls
master: 1 windows (created Thu Jun  6 19:52:54 2024)
telegram-Integration: 1 windows (created Thu Jun  6 20:07:40 2024)
test2: 1 windows (created Thu Jun  6 19:52:54 2024)
VecH
() автор топика
Последнее исправление: VecH (всего исправлений: 1)
Ответ на: комментарий от VecH

А зачем в этой схеме tmux теперь? Я предлагал запускать memogram напрямую. (Еще раз, а что это? Есть ссылка на репу/доки?)

Jun 06 19:52:54 vps01 systemd[1]: Finished tmux telegram-Integration service.

Получается, что memogram сразу упал.

Для разбирательства можно добавить remain-on-exit on к параметрам tmux, тогда можно будет и после падения подключиться к сессии и посмотреть.

Но повторюсь, что нужно выбросить tmux из цепочки, а то весь смысл unit теряется.

Belkrr
()
Ответ на: комментарий от Belkrr

memogram - https://github.com/usememos/telegram-integration Интеграция телеграм в свой solf-hosted сервис для заметок https://www.usememos.com/

убрать то я уберу и запущу напрямую без tmux но мне любопытно и хочу все же добиться его работы в tmux

remain-on-exit on

куда добавить?

ExecStart=/usr/bin/tmux new-session -s telegram-Integration -d "source /root/.bashrc; source /root/.profile; tmux set-option -t telegram-Integration remain-on-exit; cd /opt/telegram-integration; ./memogram"

Сделал так

и наконец то вижу какую то ошибку

2024/06/07 12:49:12 INFO Memogram started
2024/06/07 12:49:12 ERROR failed to get workspace profile err="rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 127.0.0.1:5230: connect: connection refused\""

я так понимаю не может подцепиться к сервису заметок, а он еще не стартанул (сидит в докере) надо таймаут сделать или можно адекватно в systemd сделать запрос по IP:port и дожидаться его запуска ?

и попутно вижу две ошибки что sh не знает команду source поменял дефолтный shell на bash для tmux ошибка вроде бы пропала

# cat /etc/tmux.conf
set -g mouse on
set-option -g default-shell /bin/bash

в мастер сервисе добавил ожидание сети, для memogram поставил таймер в 60 секунд, вроде бы все запустилось и работает

# cat /etc/systemd/system/tmux_master.service
[Unit]
Description=tmux master service
Wants=network.target
After=network.target

[Service]
Type=forking
User=root
ExecStart=/usr/bin/tmux new-session -s master -d
ExecStop=/usr/bin/tmux kill-session -t master

[Install]
WantedBy=multi-user.target
# cat /etc/systemd/system/tmux_telememos.service
[Unit]
Description=tmux telegram-Integration service
PartOf=tmux_master.service
After=tmux_master.service

[Service]
Type=oneshot
RemainAfterExit=yes
User=root
ExecStartPre=/usr/bin/sleep 60
ExecStart=/usr/bin/tmux new-session -s telegram-Integration -d "source /root/.bashrc; source /root/.profile; tmux set-option -t telegram-Integration remain-on-exit; cd /opt/telegram-integration; ./memogram"
ExecStop=/usr/bin/tmux kill-session -t telegram-Integration

[Install]
WantedBy=multi-user.target
VecH
() автор топика
Ответ на: комментарий от Belkrr

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

[Unit]
Description=tmux Telegram-Integration service
Wants=network.target
After=network.target

[Service]
Type=forking
User=root
ExecStartPre=/usr/bin/sleep 60
ExecStart=/usr/bin/tmux new-session -s telegram-integration -d "source /root/.bashrc; source /root/.profile; tmux set-option -t telegram-integration remain-on-exit on; cd /opt/telegram-integration; ./memogram"
ExecStop=/usr/bin/tmux kill-session -t telegram-integration

[Install]
WantedBy=multi-user.target

Так все запускается в tmux, вроде добился чего хотел, теперь со спокойной душой запускаю сервис без tmux-а

[Unit]
Description=Memogram service (Telegram-Integration)
Wants=network.target
After=network.target

[Service]
Type=forking
User=root
Restart=always
RestartSec=10
WorkingDirectory=/opt/telegram-integration
ExecStart=/opt/telegram-integration/memogram &
ExecStop=/usr/bin/kill memogram

[Install]
WantedBy=multi-user.target
VecH
() автор топика
Ответ на: комментарий от VecH

С этим приложением какой то косяк, оно сырое, скрипт systemd пришлось чуть подкорректировать

[Unit]
Description=Memogram service (Telegram-Integration)
Wants=network.target
After=network.target

[Service]
Type=forking
User=root
Restart=always
RestartSec=10
WorkingDirectory=/opt/telegram-integration
ExecStart=/usr/bin/bash -c '/opt/telegram-integration/memogram &'
ExecStop=/usr/bin/killall memogram

[Install]
WantedBy=multi-user.target
VecH
() автор топика
Ответ на: комментарий от VecH

Тут проблема не в приложении.

ExecStart запускает команду напрямую. Без оболочки, поэтому & не отправляет команду в фон, а передается как аргумент. Ну и ожидаемо, что на левый аргумент memogram ругается.

Во втором случае работает, т.к. ты руками запустил шелл и уже он парсил команду и распарсил &.

Думаю идеальный вариант такой:

Type=simple
ExecStart=/opt/telegram-integration/memogram

В этом случае ExecStop не понадобится, т.к. systemd сам отправит SIGTERM.

Но в этом случае нужные переменные среды придется добавить в юнит.

Belkrr
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.