How to set process ID in Linux for a specific program

后端 未结 6 917
后悔当初
后悔当初 2020-12-03 01:15

I was wondering if there is some way to force to use some specific process ID to Linux to some application before running it. I need to know in advance the process ID.

相关标签:
6条回答
  • 2020-12-03 01:52

    Every process on a linux system is generated by fork() so there should be no way to force a specific PID.

    0 讨论(0)
  • 2020-12-03 01:54

    As many already suggested you cannot set directly a PID but usually shells have facilities to know which is the last forked process ID.

    For example in bash you can lunch an executable in background (appending &) and find its PID in the variable $!. Example:

    $ lsof >/dev/null &
    [1] 15458
    $ echo $!
    15458
    
    0 讨论(0)
  • 2020-12-03 02:00

    There's no way to force to use specific PID for process. As Wikipedia says:

    Process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at 300 and again increases. In Mac OS X and HP-UX, allocation restarts at 100. However, for this and subsequent passes any PIDs still assigned to processes are skipped

    0 讨论(0)
  • 2020-12-03 02:05

    Actually, there is a way to do this. Since kernel 3.3 with CONFIG_CHECKPOINT_RESTORE set(which is set in most distros), there is /proc/sys/kernel/ns_last_pid which contains last pid generated by kernel. So, if you want to set PID for forked program, you need to perform these actions:

    1. Open /proc/sys/kernel/ns_last_pid and get fd
    2. flock it with LOCK_EX
    3. write PID-1
    4. fork

    Voilà! Child will have PID that you wanted. Also, don't forget to unlock (flock with LOCK_UN) and close ns_last_pid.

    You can checkout C code at my blog here.

    0 讨论(0)
  • 2020-12-03 02:11

    You could just repeatedly call fork() to create new child processes until you get a child with the desired PID. Remember to call wait() often, or you will hit the per-user process limit quickly.

    This method assumes that the OS assigns new PIDs sequentially, which appears to be the case eg. on Linux 3.3.

    The advantage over the ns_last_pid method is that it doesn't require root permissions.

    0 讨论(0)
  • 2020-12-03 02:15

    On CentOS7.2 you can simply do the following:

    Let's say you want to execute the sleep command with a PID of 1894.

    sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
    

    (However, keep in mind that if by chance another process executes in the extremely brief amount of time between the echo and sleep command you could end up with a PID of 1895+. I've tested it hundreds of times and it has never happened to me. If you want to guarantee the PID you will need to lock the file after you write to it, execute sleep, then unlock the file as suggested in Ruslan's answer above.)

    0 讨论(0)
提交回复
热议问题