通过以下方式从提示中轻松获取后台进程ID:
$ my_daemon &
$ echo $!
Run Code Online (Sandbox Code Playgroud)
但是,如果我想以不同的用户身份运行它,例如:
su - joe -c "/path/to/my_daemon &;"
Run Code Online (Sandbox Code Playgroud)
现在我如何捕获my_daemon的PID?
Jon*_*ler 13
简洁 - 有很多困难.
您必须安排su'd shell将子PID写入文件,然后选择输出.鉴于它将'joe'创建文件而不是'dex',这增加了另一层复杂性.
最简单的解决方案可能是:
su - joe -c "/path/to/my_daemon & echo \$! > /tmp/su.joe.$$"
bg=$(</tmp/su.joe.$$)
rm -f /tmp/su.joe.$$ # Probably fails - joe owns it, dex does not
Run Code Online (Sandbox Code Playgroud)
下一个解决方案涉及使用备用文件描述符 - 数字3.
su - joe -c "/path/to/my_daemon 3>&- & echo \$! 1>&3" 3>/tmp/su.joe.$$
bg=$(</tmp/su.joe.$$)
rm -f /tmp/su.joe.$$
Run Code Online (Sandbox Code Playgroud)
如果你担心中断等(你可能应该这样),那么你也会陷入困境:
tmp=/tmp/su.joe.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
su - joe -c "/path/to/my_daemon 3>&- & echo \$! 1>&3" 3>$tmp
bg=$(<$tmp)
rm -f $tmp
trap 0 1 2 3 13 15
Run Code Online (Sandbox Code Playgroud)
(捕获的信号是HUP,INT,QUIT,PIPE和TERM - 加上0表示shell退出.)
警告:好理论 - 未经测试的代码......
| 归档时间: |
|
| 查看次数: |
5988 次 |
| 最近记录: |