Lancer le processus-id hors de commande lancé avec "su -c"

9

J'exécute un programme java à l'intérieur d'un shell et j'écris l'identifiant du processus dans un fichier texte. Alors quand je fais ça:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

Ça marche. Mais je veux vraiment l'exécuter en tant qu'autre utilisateur

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

Ça ne marche pas. Existe-t-il un moyen d'obtenir le processus-id de la commande lancée avec l'option -c?

Prasanth
la source

Réponses:

8

Tu peux faire:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(cela suppose que le shell de connexion appuserest de type Bourne).

su -réinitialise l'environnement, donc si vous voulez avoir des variables développées dans la ligne de commande, cela doit être fait par votre shell (pas le shell de connexion de l'utilisateur distant) comme:

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

(cela suppose que ces variables ne contiennent pas de guillemets simples).

Vous voulez que la redirection soit effectuée par votre shell (fonctionnant en tant que root), pas par appuserle shell (qui n'a probablement pas la permission d'écrire /var/run).

Stéphane Chazelas
la source
2
Je vous remercie. Cela a fonctionné, mais j'ai dû le modifier un peu pour mon cas. Pour une raison quelconque, j'ai dû ajouter une barre oblique inverse avant $! puis j'ai dû le diriger vers un fichier tmp en raison de problèmes d'autorisation. La ligne suivante le lirait du fichier tmp et le placerait à l'emplacement approprié. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth
@Prasanth, voir ma modification.
Stéphane Chazelas