Exécutez une session d'écran au démarrage à partir de rc.local

9

J'essaie d'exécuter un écran détaché sous un utilisateur spécifique dans rc.local au démarrage. Le code ci-dessous est ce que j'ai jusqu'à présent, mais il ne fonctionne pas pour moi. La partie su semble me donner une erreur.

su - username -c /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'
ATLChris
la source

Réponses:

13

Je pense que les deux -cparamètres ( suet bash) devront être cités au minimum.

su - username -c "/usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'"

On -s'attend également à ce qu'il soit le dernier et peut ne pas être souhaitable ici (voir man su).


Encore quelques remarques. sudo pourrait être un meilleur choix pour une commande à un coup comme la vôtre, mais pas nécessairement:

sudo -iu username /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'

En particulier, vous pouvez utiliser un niveau de cotation en moins avec sudo.

Vous devez également faire attention à exécuter des commandes sans chemin absolu dans un contexte privilégié. Cela vaut pour su(ou sudo) mais aussi pour le chemin d'accès à bashdans votre commande. Vous le faites bien avec screen.

Je viens de tester ce qui suit et cela fonctionne bien. Je pense que -c'est le principal problème dans votre ligne d'origine:

/bin/su username -c "/usr/bin/screen -dmS test bash -c '/home/username/test.sh; exec bash'"

Remarque maléfique: pourquoi ne pas tmuxessayer? J'ai récemment changé et je n'ai jamais regardé en arrière. La seule chose que je devais changer immédiatement était la combinaison de touches préfixe qui tmuxpar défaut Ctrl+ B- Retour à la GNU screende Ctrl+ A.

Il permet de diviser votre fenêtre en un nombre presque arbitraire de volets (verticalement et horizontalement) et son format de fichier de configuration (y compris celui pour le statut par) est en fait intelligible pour les humains. Bien sûr, tmuxc'est aussi bien que screenlorsque vous voulez simplement exécuter un programme / script non écrit à l'origine en tant que démon en arrière-plan. Cependant, si vous avez l'intention d'interagir avec le multiplexeur de terminaux, je le recommande vivement tmux.

0xC0000022L
la source
Je vais essayer ceci dans quelques-uns. Le script que j'exécute utilise des chemins absolus, alors recommanderiez-vous suou sudo?
ATLChris
1
sudon'est pas un bon choix s'il est exécuté à partir de rc.local où vous êtes déjà root, car vous manquerez un shell de connexion. Sur une note latérale, jetez un œil à /etc/init/tty1.conf- remplacer [a] getty par écran ici.
aquaherd
@aquaherd: c'est ce que j'avais en tête quand j'ai écrit mais pas forcément . L'indice, vraiment, est dans l'habituel sudo su -... sudo(superutilisateur do), su(changer d'utilisateur) ... bonne idée sur le .conf
0xC0000022L
1
Je dois dire que je suis +1 sur ce post juste à cause de votre mauvaise remarque. J'aime cela! C'est un excellent remplacement à l'écran, car on peut le forcer à démarrer une nouvelle session.
The Quantum Physicist
@aquaherd sudopeut très bien démarrer un shell de connexion en utilisant -i.
muru
1

Essayez sudo -u usernameau lieu desu - username

prophétie201
la source
1

Voici ce que j'ai utilisé, je l'ai trouvé le plus propre et le plus simple (testé moi-même):

Remplacez "utilisateur" par l'utilisateur pour l'exécuter en tant que. Remplacez "nameyouchoose" comme nom de la session écran Remplacez "/script/start.bash" par le chemin de votre script.

/usr/bin/sudo -u user /usr/bin/screen -dmS nameyouchoose /script/start.bash

Source: http://realtechtalk.com/How_to_start_screen_in_bash_script_or_from_etcrclocal_on_startup_as_a_specific_user-1980-articles

Areeb Soo Yasir
la source