pidExists.mjs

/**
 * 同步判斷PID是否存在(exit/signal處理器內使用:事件迴圈不再推進,isChildAlive不會更新)
 *
 * 以kill(pid,0)探測:成功為存在、ESRCH為不存在、EPERM為存在(無權限)。PID回收只會造成誤報存在,不會誤殺
 *
 * @param {Number|String} pid 輸入PID
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {Function} [opt.kill] 輸入kill函數,預設process.kill
 * @returns {Boolean} 回傳是否存在
 * @example
 *
 * import pidExists from 'w-package-tools-e2e/src/pidExists.mjs'
 *
 * console.log(pidExists(process.pid))
 * // => true
 *
 */
function pidExists(pid, opt = {}) {
    let { kill = (p, s) => process.kill(p, s) } = opt
    try {
        kill(Number(pid), 0)
        return true
    }
    catch (e) {
        return !!e && e.code === 'EPERM'
    }
}


export default pidExists