퍼블리싱을 진행할때 express 를 주로 사용한다.
그리고 테스트로는 playwright을 사용하게 되는데, playwright는 브라우저 기반이라, 서버가 존재해야 한다.
개발하기 위해 서버를 켜놓고, playwright을 실행하면이야 정상적으로 돌아가지만,
가끔씩(이라 쓰고 엄청 자주) 하라는 개발은 안하고, 테스트만 돌리게 되면, 서버가 실행되지 않아서 모르겠는데요 하고 누워버리는 현상이 발생한다.
그래서 개발서버가 켜져 있는지 확인하기 위해 포트번호를 확인해서, playwright을 동작 시키거나
주로 개발하거나 배포하기 위한 환경(express 나 storybook 같은)이 현재 살아있는지를 체크하려고 한다.
// 포트번호 기준해서, pid값 구하는거 (netstat 이용)
import { exec } from "child_process"; // 작으니까 exec
const splitStat = (stat:string):string[] => stat.trim().split(/\s+/); // 띄어쓰기를 기준으로 스플릿
const findPidFromPort = (port_:number):Promise<number> => {
return new Promise((resolve,reject) => {
exec(`netstat -ano`,(err,stdout,stderr) => {
if(err) reject(err); // 에러가 존재 한다면 리턴해준다.
if(stderr) reject(stderr); // 표준에러가 존재 한다면 리턴해준다.
const _portReg = new RegExp(`:${port_}$`); // 포트번호가 딱 떨어져야함
const _row = stdout.split(/\n/).find((row_) => {
const _target = splitStat( row_ )[1]; // 내부아이피만 체크
return (_portReg).test(_target); // 입력된 내부포트를 가진 row 만 리턴.
});
// 포트가 존재하면
const _result = (_row) ? Number( splitStat(_row).pop() ) : 0;
resolve(_result);
});
});
};
export default findPidFromPort;
port로 서버 실행여부를 확인하려고 만든건데 요즘에는 주로 프로세스를 없애는 용도(process.kill) 로 주로 사용하고 있다. 특히나 퍼블리싱 검수용으로 w3c validator(v.Nu)를 로컬로 실행해서 체크하는 자동화를 많이 쓰는데, 서버 키고, 끄고가 귀찮을때(...) 주로 쓰고 있다.