.NET Debian应用关闭/卸载时,如何让启动的进程持续运行?
解决.NET应用启动Linux进程在应用关闭后被终止的问题
核心解决方案:调整执行命令(无需修改现有C#方法)
直接使用包含setsid的命令替代原有命令,确保进程脱离应用的进程组和会话:
sudo nohup setsid sh -c 'ping google.com' > /dev/null 2>&1 &
为什么原有命令失效?
你之前用nohup sh -c 'ping google.com' > /dev/null &,虽然加了nohup和后台运行符号&,但启动的ping进程仍然属于.NET应用启动的bash进程组。当.NET应用关闭时,bash进程会被终止,同时会向同组的子进程发送SIGHUP信号,导致ping被终止。而setsid会创建一个新的会话,让ping进程成为新会话的领头进程,彻底脱离原进程组,这样应用关闭时就不会影响它。
适配卸载场景:记录进程ID以便停止
因为进程脱离了服务的管控,卸载时需要手动找到并停止它,建议执行命令时将进程ID写入pid文件:
sudo nohup setsid sh -c 'ping google.com' > /dev/null 2>&1 & echo $! > /var/run/myapp_target.pid
这样在卸载脚本中,可以读取pid文件来停止进程:
if [ -f /var/run/myapp_target.pid ]; then kill $(cat /var/run/myapp_target.pid) rm /var/run/myapp_target.pid fi
权限注意事项
- 确保.NET应用的服务账号拥有sudo执行该命令的权限,且无需输入密码(可通过
visudo配置,添加类似myappuser ALL=(ALL) NOPASSWD: /usr/bin/nohup, /usr/bin/setsid, /bin/sh的规则)。 /var/run/目录需要服务账号有写入权限,或者指定一个应用有权限的路径存储pid文件。
内容的提问来源于stack exchange,提问作者Frixer
相关产品推荐
相关产品推荐

