You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何可靠检测当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:02:37