Mar*_*ark 5 bash arch-linux profile raspberry-pi
我在树莓派上运行 Arch-Linux ARM。
我的项目目标是将条形码扫描仪连接到 Pi,将扫描的消息转发到 LAN 中的服务器。
为了加强系统以防止断电等并最大限度地减少所需的用户交互,我希望对其进行设置,以便某个用户在启动时自动登录(完成并工作),并且在启动时运行特定程序(完成并运行)有效但不符合预期)。
到目前为止,我已经通过添加
exec mono scannerSoftware.exe 127.0.0.1 1234 randomString
Run Code Online (Sandbox Code Playgroud)
以/home/certainUser/.bash_profile这样会将它甚至当我在来回切换到root(对比的.bashrc)只执行一次。
我遇到的特殊问题:当我启动系统时,它按预期工作(以某个用户身份登录,启动扫描仪软件.exe);但是如果我想切换用户并点击Ctrl+ C,它会重新启动登录过程,再次登录某些用户并再次运行程序 => 回到我来自的地方。
我对为什么会发生这种情况的猜测是系统检测到“登录未完成,最好重新启动”。
我可以通过滥发规避这一Ctrl+C周围的登录权限,让我几乎打断了它。当然,这不是好的做法。可以说它根本不实用。
我的问题:
我如何设置它以便在登录完成后执行程序,以便Ctrl+ C'ing out 将我带到一个正常的 bash 提示,而不是开始无休止的登录周期?
编辑:
我没有使用任何图形界面等,只有命令行(tty 上的 bash),因为完成后系统甚至不会有显示。
小智 6
如果您只想在启动时启动程序,登录脚本是错误的地方。
相反,编写一个 systemd 单元文件(因为 Arch 似乎使用 systemd)。
创建/etc/systemd/system/scanner.service(或whatever.service):
[Unit]
Description=(description of your program)
[Service]
ExecStart=/usr/bin/mono /path/to/scannerSoftware.exe 127.0.0.1 1234 randomString
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
并运行systemctl daemon-reload。
运行systemctl enable scanner.service以使其在启动时运行。
您可以使用systemctl start scanner.service和手动启动和停止它,systemctl stop scanner.service并使用 来查看其状态systemctl status scanner.service。
答案取决于您的要求。
您可能只希望它在特定用户登录后启动,或者您可能希望它在重新引导期间启动(服务)。?
从登录开始
当您启动一个程序时,exec它会替换用于启动它的进程。
&到命令行,这将创建一个新进程,仍然在终端上显示输出,但您的登录 shell 也会有提示,因此后台进程的输出可能会干扰你的前台 shell。您可以通过将 stdout 和 stderr 重定向到一个文件(如果不需要,甚至是 /dev/null)来克服这个问题,从而避免干扰。当您注销时,它仍在后台运行,它将收到挂断信号(但可以捕获该信号),因此仍在后台处理。如果它连接到您的终端,它将被分离(输出被丢弃,除非您已经满足了重定向)。
当您再次登录时,将启动一个新的扫描仪,除非您检查是否已经有一个正在运行,这很容易做到。
重新启动期间启动
这种方法的优点是您不需要登录即可让进程继续运行,缺点是它一直在运行,您可能不希望这样。
系统启动机制主要有 3 种:init、upstart和systemd,各有不同。传统上,/etc/rc.local 是添加计算机特定系统进程的地方。
正如 WilQu 提到的,Arch 使用systemd,并且他为此提供了一个秘诀,所以我不再重复。
建议
编写一个脚本来启动您的进程,即使它只有一行,您很可能想要做的不仅仅是执行它,所以您不妨现在就编写一个简短的脚本。(检查它是否正在运行,存储 pid,根据日期使用不同的随机字符串?谁知道......)。
这允许您开发和测试脚本,手动运行它并确保它按需要工作。
然后您可以在您想要的位置添加脚本(手动、登录配置文件、系统启动)。
| 归档时间: |
|
| 查看次数: |
17390 次 |
| 最近记录: |