linux:启动时挂起进程

| 我想产生一个挂起的进程,可能在另一个用户的上下文中(例如,通过sudo -u ...),为产生的进程设置一些iptables规则,继续运行该进程,并在该进程删除iptable规则存在。 是否有任何标准方法(bash,corutils等)可以实现上述目标?特别是,如何在挂起状态下生成进程并获取其pid?     
已邀请:
像这样编写包装脚本script0ѭ:
#!/bin/sh
kill -STOP $$                                    # suspend myself 
                                                 # ... until I receive SIGCONT
exec $@                                          # exec argument list
然后像这样调用它:
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
但是,所有这些都是过分的。您无需在挂起状态下生成进程即可完成工作。只需编写一个包装脚本
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
然后像这样称呼它
setup_iptables_and_start mycommand || report errors
teardown_iptables
    
您可以为程序编写一个C包装程序,该包装程序将执行以下操作:
fork
并打印子pid。 在孩子中,等待用户按Enter。这会使孩子入睡,您可以使用pid添加规则。 添加规则后,用户按Enter键。孩子使用
exec
system
运行您的原始程序。 这样行吗? 编辑: 实际上,您可以使用Shell脚本执行上述过程。尝试以下bash脚本:
#!/bin/bash

echo \"Pid is $$\"
echo -n \"Press Enter..\" 
read 
exec $@
您可以以
/bin/bash ./run.sh <your command>
的价格运行它     
一种实现方法是让
gdb
在程序主要功能启动时暂停程序(使用命令“ break main \”)。这将确保该过程足够快地挂起(尽管某些初始化例程可以在
main
之前运行,但它们可能不会做任何相关的事情)。但是,为此,您将需要调试信息以启动要挂起的程序。 建议您先手动尝试一下,看看它是如何工作的,然后再找出如何编写完成的脚本。 另外,也可以不使用iptables,而使用SELinux或基于sydbox的基于ptrace的工具来限制进程(如果确实是您要这样做!)。     
我想您可以自己编写一个可以进行分叉的实用程序,并且其中的分叉子项会在执行exec之前暂停自身。否则,请考虑使用LD_PRELOAD lib来完成您的“自定义”业务。 如果您想确保它的安全性,那么您应该考虑使用更大的工具(使用chroot,半虚拟化,用户模式linux等); 最后一个提示:如果您不介意做更多的编码,则ptrace接口应该允许您执行所描述的操作(因为它用于实现调试器)     
在实际开始运行该程序之前,可能需要先启动该程序的“ 13”。您可以这样做。 启动普通脚本 强制脚本等待 您可能会使用b14 builitin
suspend
,但在最坏的情况下,您可以使其停止并发出信号 以各种方式使用bash流程的
PID
重新启动已停止的bash进程(
SIGCONT
),然后执行
exec
-另一个内置函数-启动您的真实进程(它将继承PID)     

要回复问题请先登录注册