《进程与后台任务:nohup/screen/systemctl/service/psrecord》

《进程与后台任务: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。

阅读 — · 全站 —
🎸 我的歌单 0 首