Search code examples
linuxbashinitpid

Execute a command as another user and get the PID for that process


I'm trying to capture the PID of a program that I am running for my init script so I can come back and kill it later. When I run the script without being a different user, the command works just fine, and I get the PID in a variable. I can execute the same command as a different user, however, I cannot get the PID for that command to store in a variable. This is what I get.

[root@fenix-centos ~]# PID=`su - $USER -c "$DAEMONPATH $DAEMONPATHARGS $DAEMON $DAEMONARGS > /dev/null 2>&1 & echo \$! "`
[root@fenix-centos ~]# echo $PID

...and nothing. Is there some weird thing that would prevent me from getting the PID of a process being started by a different user and storing that PID in a variable? The process still starts, but I'm not getting the PID.


Solution

  • After going though the link to your script, i suggest this approach:

    Perform variable (that you're passing as argument to your command su) assignment in a file:

    [tom@jenkins ]# cat source_file
    DAEMONPATH=/usr/bin/java
    DAEMONPATHARGS='-jar -Xmx768'
    DAEMON=/opt/megamek-0.38.0/MegaMek.jar
    DAEMONARGS='-dedicated -port 2346'
    

    Source the above file in your command:

    PID=`su - $USER -c '. source_file; $DAEMONPATH $DAEMONPATHARGS $DAEMON $DAEMONARGS > /dev/null 2>&1 & echo $! '`
    

    It seems your syntax is not working because the $! must be getting evaluated by the original shell which is running su and not the shell that su runs.