如何可靠检测当前Shell是否由systemd-run --shell启动?
可靠检测当前Shell是否由
systemd-run --shell创建的方法 以下是几种针对fish shell的可靠检测方案,替代之前依赖SYSTEMD_EXEC_PID数值的不可靠方式:
1. 检查父进程命令行
systemd-run --shell启动的Shell,其父进程就是systemd-run命令本身,且携带--shell参数。可以通过查询父进程的命令行来验证:
set parent_cmd (ps -o cmd= -p $PPID) if string match -q '*systemd-run --shell*' $parent_cmd echo "当前Shell是由systemd-run --shell创建的会话" end
2. 验证systemd单元属性
由systemd-run --shell启动的Shell会隶属于一个临时systemd单元,该单元的描述字段会包含"shell"关键词。结合SYSTEMD_UNIT环境变量(systemd管理的进程都会自动设置),可以通过systemctl查询单元信息:
if set -q SYSTEMD_UNIT set unit_description (systemctl --user show -p Description $SYSTEMD_UNIT --value) if string match -q '*shell*' $unit_description echo "当前Shell是systemd-run --shell创建的会话" end end
3. 检查Cgroup归属
如果你固定使用--slice=restrict_memory.slice参数启动会话,可以直接检查当前Shell的Cgroup是否属于该slice:
if string match -q '*restrict_memory.slice*' (cat /proc/self/cgroup) echo "当前Shell是带内存限制的systemd-run会话" end
为什么之前的方法不可靠?
SYSTEMD_EXEC_PID是systemd为执行的进程分配的PID,其数值范围没有固定规则,可能小于2000(比如系统刚启动时创建的会话),因此通过数值大小判断完全不可靠。
内容的提问来源于stack exchange,提问作者Kenneth Sparks
相关产品推荐
相关产品推荐

