Как конвертировать скрипт sysvinit в systemd на Манджаро - PullRequest
0 голосов
/ 11 октября 2018

Во-первых, пожалуйста, не рассматривайте этот пост как системный обзор или критику, но только и просто как просьбу о помощи.

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

Итак, вот контекст:

У меня есть программа (/ opt / myprog), который можно использовать как службу deamon во время загрузки.

При использовании предыдущих операционных систем Debian, LMDE, Mint или Ubuntu я использовал SysVinit со следующим сценарием (myprog.sh в / etc/init.d folder):

MYPROG_PATH=/opt/myprog_64
NAME="myprog"
START="-d"
STOP="-k"
TEST=""
VERSION="-v"
SCRIPTNAME=/etc/init.d/$NAME
STARTMESG="\nStarting $NAME in deamon mode.\n"
UPMESG="\$NAME is running.\n"
DOWNMESG="\$NAME is not running!\n"
TESTMESG="\nStarting NAME in client mode.\nHit Ctrl+C (or close the terminal) to stop mprog.\n"
STATUS=`pidof $NAME` 

# Exit if myprog is not installed
[ -x "$MYPROG_PATH/$NAME" ] || exit 0

case "$1" in
    start)
        sleep 3
        echo $STARTMESG
        cd $MYPROG_PATH
        ./$NAME $START
    ;;
    stop)
        cd $MYPROG_PATH
        ./$NAME $STOP
    ;;
    status)
        if [ "$STATUS" > 0 ] ; then
            echo $UPMESG
        else
            echo $DOWNMESG
        fi
    ;;
    restart)
        cd $MYPROG_PATH
        ./$NAME $STOP
        echo $STARTMESG
        ./$NAME $START
    ;;
    version)
        cd $MYPROG_PATH
        ./$NAME $VERSION
    ;;
    test)
        cd $MYPROG_PATH
        echo $TESTMESG
        ./$NAME
    ;;
    *)
        echo "Usage: $SCRIPTNAME {start|status|restart|stop|version|test}" >&2
        exit 3
    ;;
esac
:

Теперь, поскольку очевидно, что systemd будет широко применяться для замены SysVinit, в том числе на будущие дистрибутивы Debian, Mint и Ubuntu, так же как на CentOS, Fedroa или Ach и Manjaro,Я попытался адаптировать мой скрипт sysVinit для systemd с помощью следующего скрипта, который работает, но слишком ограничен (myprog.service):

Description=myprog
ConditionFileExecutable=/opt/myprog_64
After=NetworkManager.service
[Service]
Type=oneshot
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStart=/opt/myprog -d
ExecStop=/opt/myprog -k
ExecRestart=/opt/myprog-k : /opt/myprog -d
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Однако, поскольку systemd объявлен как совместимый и болееОн может быть гибче, чем SysVinit, может кто-нибудь показать мне, как добавить три следующих эквивалентных переключателя (статус, тест и версия), которые я определил в сценарии myprog.sh sysVinit, не отвечая классическим и неэффективным ответом: «человек твой друг»?

/opt/myprog status to display the myprog status (i.e. running or not)    
/opt/myprog test to start myprog not as a deamon     
/opt/myprog version to display the release of myprog

Заранее спасибо за ваше время и помощь.

1 Ответ

0 голосов
/ 15 октября 2018

systemd не поддерживает пользовательскую реализацию аргументов для systemctl.

Так что systemctl status myprog будет показывать результаты на основе выполнения Exec* настроек.

systemctl show myprogиспользует Description, поэтому при желании вы можете использовать версию в своем описании.

Если вы не хотите запускать вашу программу не как демон, вы можете запустить ее за пределами systemd.

...