《进程与后台任务:nohup/screen/systemctl/service/psrecord》
本文汇总让程序在后台稳定运行(nohup/screen)、服务化(systemd)以及记录进程资源曲线(psrecord)的方法。cron 定时任务见《Linux 定时任务 crontab》,mac 见《使用 crontab/launchctl 定时任务》。
1 nohup:后台拉起并忽略挂断信号
nohup 让命令在退出终端后继续运行,配合 & 放到后台:
nohup bash ./run_tests.sh > info.txt 2> error.txt &
echo $! > run_tests.sh.pid # 保存进程 PID 便于后续 kill/wait
关键点:
&后台执行,nohup忽略 SIGHUP(挂断)信号。- 重定向:
> info.log 2> error.log,日志分离便于排查。 - 用
cat run_tests.sh.pid拿 PID,或pgrep -f run_tests。
2 screen:会话保持 / 分身复用
screen 创建持久终端会话,断开也能恢复,适合长时间任务:
# 新建命名的 screen 会话
screen -S hello
# 在会话中启动服务
./server
# 按 Ctrl+a d 分离会话(丢到后台)
# 查看当前会话列表
screen -ls
# 重新进入指定的会话
screen -r hello
分离(detach)后进程继续运行,重连即
screen -r。
3 crontab:定时任务
安装(Debian 9 等):
apt update && apt-get install -y cron
/etc/init.d/cron start
/etc/init.d/cron status
常用:
# 每分钟执行一次并追加日志
*/1 * * * * echo `date` >> /tmp/xx.log
# 每天 10 点执行
0 10 * * * /opt/auto-sync.sh
# 查看当前用户定时任务
crontab -l
配置文件在
/var/spool/cron/$USER(root 为/var/spool/cron/root);默认编辑器可在~/.bashrc设置export VISUAL=vim。 启动与查看状态也可用service cron start、service cron status。cron 语法校验可借助在线工具。详见《Linux 定时任务 crontab》。
4 systemd:systemctl 管理服务
创建 /etc/systemd/system/<name>.service 后:
systemctl daemon-reload # 修改配置后立即生效
systemctl start myapp # 启动
systemctl enable myapp # 开机自启
systemctl status myapp
systemctl restart myapp
配置文件示例(/etc/systemd/system/myapp.service):
[Unit]
Description=My App Service
After=network.target
[Service]
Type=simple
User=appuser
ExecStart=/opt/myapp/myapp -conf /opt/myapp/config.ini
Restart=always
[Install]
WantedBy=multi-user.target
5 service / init 脚本启停
没有 systemd 时使用 /etc/init.d/(或 /etc/rc.d/init.d/)脚本:
service myapp start|stop|restart|status
# 轻写一套自己的 control.sh
./control.sh start|stop|restart|status
提示:CentOS 的函数库在
/etc/rc.d/init.d/functions,Ubuntu 在/lib/lsb/init-functions。
6 psrecord:记录进程 CPU/内存曲线
psrecord 定时采样进程 CPU 与内存,生成曲线图,适合压测/性能分析。
pip install psrecord psutil matplotlib
# 使用 PID 并输出图表(--duration 秒数 --interval 采集间隔)
psrecord <pid> --interval 1 --duration 60 --plot plot.png
# 仅输出日志
psrecord <pid> --interval 1 --log stats.log
批量记录多进程:
for pid in $(pgrep mydaemon); do
psrecord $pid --interval 1 --duration 60 --plot plot_${pid}.png &
done
wait
headless 服务器无 DISPLAY 时 matplotlib 报
no display name,改用 Agg 后端:在~/.config/matplotlib/matplotlibrc写入backend: Agg,或在代码中matplotlib.use('Agg')(须放在第一个 import 之后、pylab 之前)。
7 常用进程操作汇总
pgrep -f <pattern> # 按命令行匹配进程 PID
kill -9 <pid> # 强制杀死
ps -eo pid,etime,cmd | grep <kw> # 查看运行时长
8 总结
选择建议:长时间任务窗口断开后继续 → nohup;中断后重连查看输出 → screen;服务常驻 + 开机自启 → systemd;需要资源曲线 → psrecord。