在登录时执行程序

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

请参阅有关 systemd 的 Arch Linux 帮助


X T*_*ian 4

答案取决于您的要求。

您可能只希望它在特定用户登录后启动,或者您可能希望它在重新引导期间启动(服务)。?

从登录开始

当您启动一个程序时,exec它会替换用于启动它的进程。

  • 因此,目前,您的登录 bash 已被扫描器取代,并且 ctrl-c发送中断信号,它会停止,然后您就会注销。
  • 您可以简单地启动该程序,而不是执行它,它在前台运行(您不会收到提示)。 ctrl-c与以前的效果相同,停止扫描程序,但您将返回登录 bash 提示符。
  • 您可以在后台启动该进程,通过附加&到命令行,这将创建一个新进程,仍然在终端上显示输出,但您的登录 shell 也会有提示,因此后台进程的输出可能会干扰你的前台 shell。您可以通过将 stdout 和 stderr 重定向到一个文件(如果不需要,甚至是 /dev/null)来克服这个问题,从而避免干扰。

当您注销时,它仍在后台运行,它将收到挂断信号(但可以捕获该信号),因此仍在后台处理。如果它连接到您的终端,它将被分离(输出被丢弃,除非您已经满足了重定向)。

当您再次登录时,将启动一个新的扫描仪,除非您检查是否已经有一个正在运行,这很容易做到。

重新启动期间启动

这种方法的优点是您不需要登录即可让进程继续运行,缺点是它一直在运行,您可能不希望这样。

系统启动机制主要有 3 种:initupstartsystemd,各有不同。传统上,/etc/rc.local 是添加计算机特定系统进程的地方。

正如 WilQu 提到的,Arch 使用systemd,并且他为此提供了一个秘诀,所以我不再重复。

建议

编写一个脚本来启动您的进程,即使它只有一行,您很可能想要做的不仅仅是执行它,所以您不妨现在就编写一个简短的脚本。(检查它是否正在运行,存储 pid,根据日期使用不同的随机字符串?谁知道......)。

这允许您开发和测试脚本,手动运行它并确保它按需要工作。

然后您可以在您想要的位置添加脚本(手动、登录配置文件、系统启动)。