linux:启动时暂停进程

han*_*ans 7 linux iptables spawn

我想生成一个暂停的进程,可能在另一个用户的上下文中(例如通过sudo -u ...),为生成的进程设置一些iptables规则,继续运行进程,并在进程时删除iptable规则存在.

是否有任何标准手段(bash,corutils等)可以让我实现上述目标?特别是,如何在暂停状态下生成进程并获取其pid?

Han*_*Lub 5

写一个这样的包装脚本start-stopped.sh

#!/bin/sh
kill -STOP $$                                    # suspend myself 
                                                 # ... until I receive SIGCONT
exec $@                                          # exec argument list
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

sudo -u $SOME_USER start-stopped.sh mycommand &  # start mycommand in stopped state
MYCOMMAND_PID=$!
setup_iptables $MYCOMMAND_PID                    # use its PID to setup iptables
sudo -u $SOME_USER kill -CONT $MYCOMMAND_PID     # make mycommand continue
wait $MYCOMMAND_PID                              # wait for its termination
MYCOMMAND_EXIT_STATUS=$?                         
teardown_iptables                                # remove iptables rules
report $MYCOMMAND_EXIT_STATUS                    # report errors, if necessary
Run Code Online (Sandbox Code Playgroud)

然而,这一切都太过分了。您不需要在暂停状态下生成您的进程来完成工作。只需制作一个包装脚本setup_iptables_and_start

#!/bin/sh
setup_iptables $$             # use my own PID to setup iptables
exec sudo -u $SOME_USER $@    # exec'ed command will have same PID
Run Code Online (Sandbox Code Playgroud)

然后称之为

setup_iptables_and_start mycommand || report errors
teardown_iptables
Run Code Online (Sandbox Code Playgroud)


Rob*_*een 0

一种方法是gdb在程序的主函数开始时暂停程序(使用命令“break main”)。这将保证进程足够快地挂起(尽管某些初始化例程可以在 之前运行main,但它们可能不会执行任何相关操作)。但是,为此,您将需要要启动挂起的程序的调试信息。

我建议您先手动尝试一下,看看它是如何工作的,然后弄清楚如何编写您所做的事情的脚本。

或者,也可以使用 iptables,而是使用 SELinux 或基于 ptrace 的工具(如 sydbox)来限制进程(如果这确实是您想要做的!)。