linux_把可执行程序做成一个服务

本文介绍了在Linux系统中将可执行程序做成服务的方法,主要分三步:将程序放到系统可找到的地方;在 /etc/init.d/ 下新建服务文件;在 /etc/rc3.d/ 下建立符号连接文件。还提到用makefile文件实现步骤自动化,通过添加特定代码和执行 make install 命令完成部署。

 把可执行程序做成一个服务

    在linux系统启动的时候,我们可以看到很多服务性程序一个接一个的被启动(就是那些后面有一个兰色[OK]的行),这些在后台运行的程序为我们使用计算机起了很重要的作用,以这种方式运行的程序有以下特点:
 开机启动,关机停止(废话!关机了还运行啊???)
 后台运行
 通过service 命令控制或查看对应的程序的运行状态

    恩,不错,那怎么把我们自己编制的程序做成这样的一个服务呢?

    废话少说,主要分以下3步:

    1、把可执行程序放到一个linux系统可以找到的地方。
 在linux命令提示符下输入 env ,回车后可看到环境变量,里面有一项PATH的,对,这项里所指定的目录都是系统可找到的地方,把我们的可执行程序放入其中的一个目录下即可,我们一般放在/usr/sbin/目录下(放什么有放什么的地方,最好不要乱放)。

    2、在目录 /etc/init.d/ 下,新建一个以服务名为文件名的文件。
 如果我们打开目录 /etc/init.d/,看到的文件其实都是服务程序文件,每个文件的内容都大同小异,我们会看到,这里的文件在文件结构上几乎是一样的。几乎每个文件都有 start、stop、restart和status这样的标志,对,我们新建的这个文件也具有相同的结构,只是在这些标志内部把相应的可执行程序换成我们自己的可执行程序即可,知道怎么做了吗?那就是:复制——修改——保存。

    3、在目录 /etc/rc3.d/ 下,新建一个指向在第2步中建立的服务文件的符号连接文件。
 打开目录 /etc/rc3.d/ ,我们将看到这里都是符号连接文件(linux系统中的符号连接相当于windows中的快捷方式)。采用以下命令格式:
 ln -sf 目标文件名 连接文件名
    连接文件名益采用“SXX目标文件名”的格式,其中XX一般是一个从1到100的整数,它表示启动优先级,数字越大,优先级越低,比如:服务A的运行要依赖服务B,那A的XX数字就应该大于B的。后跟“目标文件名”是为了一目了然,一看就知道是哪个文件的符号连接。
    目录 /etc/rc3.d/ 是系统启动时自动搜索的目录,该目录下的符号连接文件的目标文件,都将被运行,这就是在这个目录建立符号连接的原因——为了开机就运行。

    好了,完成以上3个步骤,你就把自己的一个可执行程序做成系统的一个服务了,它具有我们一开始说的几个特定。我们可以用service命令控制这个程序了:
 启动:service hdz_service start
 停止:service hdz_service stop
 重启:service hdz_service restart
    上面的 hdz_service 为服务名,也就是在第2步中建立的文件名。

    不过,好象感觉比较麻烦,能否把这几个步骤自动化一下?这样在一台新机子上部署就方便了,也更象回事 -_^!办法当然有了,还记得我们那个记录代码文件之间依赖关系的makefile文件吗?呵呵,我们在这里要用到它了。
    在makefile文件中添加一个标志,并在该标志下添加和下面类似的代码:

install:
 cp ./hdz_pro /usr/sbin/
 cp ./hdz_service /etc/init.d/
 cd /etc/init.d/
 chmod +x hdz_service
 cd /etc/rc3.d/
 ln -sf ../init.d/hdz_service ./S99hdz_service

    在标志install下的没一句话,前面一定要留空白,这不仅是有利于阅读,更是一个要求,makefile文件要求每一句可执行语句前都要有空白(空格或tab)。
    上面代码中的 hdz_pro 和 hdz_service 分别是可执行文件名和服务名,这两个名称换成你自己的就行了,操作时用以下命令:
 make install
    运行完就一切OK了,简单吧?

    大家在看我写的东东时,时不时会碰到“hdz”这样的东西,这是我名字的缩写,说明这正是要替换的。

# 详解 要将斗地主游戏做成一个可在PC端运行的独立应用程序(App),需要完以下几个关键步骤:**代码完善 → 图形界面开发 → 打包为可执行文件**。下面我将详细介绍整个流程。 --- ## 步骤一:完善核心逻辑(Python) 首先,我们需要一个完整的斗地主游戏逻辑,包括: - 发牌 - 角色分配(地主/农民) - 基本出牌判断(简化版) 以下是可运行的完整代码模板: ```python import random import tkinter as tk from tkinter import messagebox # 扑克牌类 class Card: def __init__(self, suit, rank): self.suit = suit self.rank = rank self.value = self.get_value() def get_value(self): rank_map = {'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10, 'J':11,'Q':12,'K':13,'A':14,'2':15,'小王':16,'大王':17} return rank_map.get(self.rank, 0) def __str__(self): return f"{self.suit}{self.rank}" # 游戏主类 class LandlordsApp: def __init__(self, root): self.root = root self.root.title("斗地主小游戏") self.root.geometry("800x600") self.players = [[] for _ in range(3)] self.landlord_cards = [] self.landlord_id = -1 self.setup_ui() def setup_ui(self): tk.Label(self.root, text="斗地主游戏", font=("Arial", 18)).pack(pady=20) tk.Button(self.root, text="开始新游戏", command=self.start_game, height=2, width=20).pack(pady=10) self.text_area = tk.Text(self.root, height=20, width=80, state='disabled') self.text_area.pack(pady=10) def create_deck(self): suits = ['♠', '♥', '♦', '♣'] ranks = [str(i) for i in range(3, 11)] + ['J','Q','K','A','2'] deck = [Card(suit, rank) for suit in suits for rank in ranks] deck.extend([Card('', '小王'), Card('', '大王')]) return deck def start_game(self): self.clear_text() deck = self.create_deck() random.shuffle(deck) for i in range(17): for j in range(3): self.players[j].append(deck.pop()) self.landlord_cards = [deck.pop(), deck.pop(), deck.pop()] self.landlord_id = random.randint(0, 2) self.players[self.landlord_id].extend(self.landlord_cards) for hand in self.players: hand.sort(key=lambda x: x.value) self.display_hands() def display_hands(self): self.write_text("🎮 开始斗地主游戏!\n") roles = ["农民", "农民", "农民"] roles[self.landlord_id] = "地主 🤴" for i in range(3): cards_str = " ".join(str(c) for c in self.players[i]) self.write_text(f"玩家{i+1}({roles[i]}):{cards_str}\n\n") bottom_str = " ".join(str(c) for c in self.landlord_cards) self.write_text(f"🃏 底牌:{bottom_str}") def write_text(self, text): self.text_area.config(state='normal') self.text_area.insert(tk.END, text + "\n") self.text_area.config(state='disabled') def clear_text(self): self.text_area.config(state='normal') self.text_area.delete(1.0, tk.END) self.text_area.config(state='disabled') self.players = [[] for _ in range(3)] # 主程序入口 if __name__ == "__main__": root = tk.Tk() app = LandlordsApp(root) root.mainloop() ``` --- ## 步骤二:安装必要工具 确保你已经安装了 Python 和以下库: ```bash pip install pyinstaller ``` > 注:`tkinter` 是 Python 内置库,无需单独安装。 --- ## 步骤三:打包 `.exe` 文件(Windows) 在项目目录下打开终端,运行: ```bash pyinstaller --windowed --onefile --icon=game.ico landlords.py ``` 参数说明: - `--windowed`:不显示命令行窗口(适合 GUI 程序) - `--onefile`:打包单个 `.exe` 文件 - `--icon`:设置图标(可选,准备一个 `.ico` 文件) 完后,在 `dist/` 目录中会生 `landlords.exe`,双击即可运行! --- ## 最终效果 ✅ 用户打开即用 ✅ 支持 Windows/Mac/Linux(跨平台) ✅ 不依赖 Python 环境 ✅ 图形化界面,点击“开始新游戏”即可玩 --- # 知识点 - **tkinter图形界面**:Python内置GUI库,用于创建窗口、按钮和文本框。 - **PyInstaller打包**:将Python脚本转化为独立可执行文件,便于分发。 - **事件驱动编程**:通过按钮绑定函数实现用户交互响应。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值