Откройте 2 экземпляра терминала mate и выполните команды

Вопрос или проблема

Я пытаюсь настроить скрипт, который запускает 2 экземпляра mate-terminal, каждый с разной командой.

Скрипт настроен как cronjob.

Проблема в том, что, хотя скрипт работает нормально при ручном выполнении в терминале, он не открывает 2 окна терминала.

Я пробовал разные подходы, но ничего не сработало. У меня также установлен gnome-terminal, результат тот же.

Скрипт выполняется, завершает процессы и их терминал, но на этом все.

ПС: Скрипт выполняется, он убивает все процессы и окна терминала, но не открывает новые окна терминала с заданными командами.

Это старое приложение, и единственное логирование доступно в терминале в реальном времени. Поскольку нет планов по обновлению приложения в ближайшее время, чтобы экспортировать лог в внешний файл, это является требованием.

Есть идеи, что я делаю не так?

#!/bin/bash

export DISPLAY=:10.0
export XAUTHORITY=/home/lxadmin/.Xauthority
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

echo "Скрипт запущен в $(date)" >> /home/lxadmin/Logs/MyApp.log

close_running_terminals() {
    echo "Закрываем запущенные терминалы" >> /home/lxadmin/Logs/MyApp.log
    
    pkill -f "node"
    pkill -f "npm"

    for terminal in $(pgrep -f mate-terminal); do
        if ps -o args= -p $terminal | grep -qE 'node|npm'; then
            echo "Убиваем процесс mate-terminal: $terminal" >> /home/lxadmin/Logs/MyApp.log
            kill -9 $terminal
        fi
    done

    sleep 2
}

open_terminal_and_run() {
    local cmd=$1
    echo "Запуск команды: $cmd" >> /home/lxadmin/Logs/MyApp.log
    /usr/bin/mate-terminal -- /bin/sh -c "$cmd; exec bash"
    #/usr/bin/mate-terminal -- bash -c "$cmd; exec bash"
}

close_running_terminals

open_terminal_and_run "cd /home/lxadmin/Servers/MyApp/server && /usr/local/lib/nodejs/node-v12.13.1-linux-x64/bin/nodemon app.js"

sleep 5

open_terminal_and_run "cd /home/lxadmin/Servers/MyApp/client && /usr/local/bin/npm run dev"

echo "Скрипт завершен в $(date)" >> /home/lxadmin/Logs/MyApp.log

Ответ или решение

Настройка запуска двух экземпляров mate-terminal с помощью сценария

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

Проблема и основы

Ключевая проблема заключается в том, что при запуске через cron среда выполнения может отличаться от той, которая используется в интерактивной сессии терминала. Это может быть связано с неправильной установкой переменных окружения, отсутствием прав доступа или проблемами с графическим дисплеем.

Настройка окружения

В вашем сценарии вы уже экспортируете переменную DISPLAY и указываете путь к файлу Xauthority. Убедитесь, что:

  1. DISPLAY: Убедитесь, что указанное значение :10.0 действительно корректное для вашего окружения. Введите echo $DISPLAY в вашей обычной сессии терминала и используйте это значение.

  2. XAUTHORITY: Проверьте, правильно ли указан путь к файлу Xauthority. Вы можете это сделать, выполнив ls -l /home/lxadmin/.Xauthority.

Корректировка сценария

Приведенный вами скрипт имеет несколько моментов, которые можно улучшить:

  1. Запуск терминала: Убедитесь, что mate-terminal запускается с нужными параметрами. Ниже представлены упрощенные команды для запуска терминала:
/usr/bin/mate-terminal --window -- /bin/sh -c "cd /home/lxadmin/Servers/MyApp/server && /usr/local/lib/nodejs/node-v12.13.1-linux-x64/bin/nodemon app.js; exec bash"
  1. Проверка прав: Проверьте, что ваша cron-задача имеет доступ к графической среде. Для этого добавьте запись в ваше crontab:
* * * * * DISPLAY=:10.0 /path/to/your/script.sh

Логирование

Хорошая практика — это логирование всех шагов, что вы уже делаете. Убедитесь, что вывод отладки достаточен для понимания, что произошло во время выполнения вашего скрипта. Для более подробного логирования вы можете перенаправить stderr и stdout в ваш лог-файл:

exec > /home/lxadmin/Logs/MyApp.log 2>&1

Если все сделано правильно, откройте консоль и выполните crontab -l для проверки зарегистрированной cron-задачи.

Заключение

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

Следуя этим рекомендациям, вы должны добиться успешного выполнения вашего задания в рамках требований по логированию и запуску двух экземпляров mate-terminal с различными командами.

Оцените материал
Добавить комментарий

Капча загружается...