Linux: process into a service
That depends on your system manager
the most common way to do that on debian/ubuntu is to build an initscript and place it in /etc/init.d
or /etc/rc/init.d
and place a script named mytestprogram
in that.
this is an example initscript:
#!/bin/sh
### BEGIN INIT INFO
# Provides: testone
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: false
# Short-Description: Example init script
# Description: Start/stop an example script
### END INIT INFO
DESC="test script"
NAME=testone
#DAEMON=
do_start()
{
echo "starting!";
}
do_stop()
{
echo "stopping!"
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
esac
exit 0
I suggest you to look some scripts in that directory, It's simple if you know bash a little ;)
Is it possible to pass input to a running service or daemon?
On Linux, all running processes have a special directory under /proc
containing information and hooks into the process. Each subdirectory of /proc
is the PID of a running process. So if you know the PID of a particular process you can get information about it. E.g.:
$ sleep 100 & ls /proc/$!
...
cmdline
...
cwd
environ
exe
fd
fdinfo
...
status
...
Of note is the fd
directory, which contains all the file descriptors associated with the process. 0
, 1
, and 2
exist for (almost?) all processes, and 0
is the default stdin. So writing to /proc/$PID/fd/0
will write to that process' stdin.
A more robust alternative is to set up a named pipe connected to your process' stdin; then you can write to that pipe and the process will read it without needing to rely on the /proc
file system.
See also Writing to stdin of background process on ServerFault.
Difference between a service and a process which is running in a background by & command
The first is started on your local term and "pushed" on background. You can see it with the jobs
command. Pushing in forground with fg
command for example.
The first command was killed when you close your current term.
The second is a daemon, not assingned to a terminal. It run every time
How to start multiple processes inside a linux service construct?
As suggested by @nos, I added strace -f to trace the calls during the service memcached start
operation. I compared the traced calls between the unsuccessful/terminated process and the successful process. The only lines of significant difference that I found were:
< bind(26, {sa_family=AF_INET, sin_port=htons(11216), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EACCES (Permission denied)
< dup(2) = 27
< fcntl(27, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
< fstat(27, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
< ioctl(27, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff20d5d780) = -1 ENOTTY (Inappropriate ioctl for device)
< mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5dae958000
< lseek(27, 0, SEEK_CUR) = 0
< write(27, "bind(): Permission denied\n", 26) = 26
< close(27) = 0
< munmap(0x7f5dae958000, 4096) = 0
< close(26) = 0
< dup(2) = 26
< fcntl(26, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
< fstat(26, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
< ioctl(26, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff20d5d730) = -1 ENOTTY (Inappropriate ioctl for device)
< mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5dae958000
< lseek(26, 0, SEEK_CUR) = 0
< write(26, "failed to listen on TCP port 112"..., 54) = 54
< close(26) = 0
< munmap(0x7f5dae958000, 4096) = 0
< exit_group(71) = ?
---
> bind(26, {sa_family=AF_INET, sin_port=htons(11211), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
> listen(26, 1024) = 0
> epoll_ctl(3, EPOLL_CTL_ADD, 26, {EPOLLIN, {u32=26, u64=26}}) = 0
> socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = 27
> fcntl(27, F_GETFL) = 0x2 (flags O_RDWR)
> fcntl(27, F_SETFL, O_RDWR|O_NONBLOCK) = 0
> setsockopt(27, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
> setsockopt(27, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
> setsockopt(27, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
> setsockopt(27, SOL_SOCKET, SO_LINGER, {onoff=0, linger=0}, 8) = 0
> setsockopt(27, SOL_TCP, TCP_NODELAY, [1], 4) = 0
> bind(27, {sa_family=AF_INET6, sin6_port=htons(11211), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
> listen(27, 1024) = 0
> epoll_ctl(3, EPOLL_CTL_ADD, 27, {EPOLLIN, {u32=27, u64=27}}) = 0
> socket(PF_NETLINK, SOCK_RAW, 0) = 28
> bind(28, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
> getsockname(28, {sa_family=AF_NETLINK, pid=31943, groups=00000000}, [12]) = 0
> gettimeofday({1393735036, 191154}, NULL) = 0
> sendto(28, "\24\0\0\0\26\0\1\3|\265\22S\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
> recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0|\265\22S\307|\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 108
> recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0|\265\22S\307|\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 128
> recvmsg(28, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0|\265\22S\307|\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
> close(28) = 0
> socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 28
The top (<) one being from a terminated process and bottom one (>) from the last (successful) process. It is clear that the process is terminating due to lack of permission to bind to the port. On looking further, I realized that the SELinux was set to ENFORCE, which was preventing the memcached service from binding to port other than 11211 (the default port).
To the best of what I could figure, when I was running it without the service
command, the behavior was simply that of a process (not a service) and hence the binding was not being enforced.
Turning off the ENFORCED mode of SELinux, got the service memcached start
command working!
How to list daemon (services) process in linux, as with psutil?
The service
command in WSL shows Windows services. As we've determined (in in-comment discussion) that you're trying to list Linux services, and using WSL only as a test platform, this answer is written to apply to the majority of Linux distributions, rather than to WSL.
The following will work on Linux distros using systemd as their init system (this applies to most modern distros -- including current releases of Arch, NixOS, Fedora, RHEL, CentOS, Debian, Ubuntu, etc). It will not work on WSL -- at least, not the version you quoted, which does not appear to be using systemd as its init system.
#!/usr/bin/env python
import re
import psutil
def log_running_services():
known_cgroups = set()
for pid in psutil.pids():
try:
cgroups = open('/proc/%d/cgroup' % pid, 'r').read()
except IOError:
continue # may have exited since we read the listing, or may not have permissions
systemd_name_match = re.search('^1:name=systemd:(/.+)$', cgroups, re.MULTILINE)
if systemd_name_match is None:
continue # not in a systemd-maintained cgroup
systemd_name = systemd_name_match.group(1)
if systemd_name in known_cgroups:
continue # we already printed this one
if not systemd_name.endswith('.service'):
continue # this isn't actually a service
known_cgroups.add(systemd_name)
print(systemd_name)
if __name__ == '__main__':
log_running_services()
Related Topics
How to Have Simple and Double Quotes in a Scripted Ssh Command
Multiple Websites on Nginx & Sites-Available
Converting Jiffies to Milli Seconds
Why No Output Is Shown When Using Grep Twice
Responsibility of Stack Alignment in 32-Bit X86 Assembly
How to Check If a Key Was Pressed in Linux
Setting Default Permissions for Newly Created Files and Sub-Directories Under a Directory in Linux
How to Execute a Remote Command Over Ssh with Arguments
Sed with Literal String--Not Input File
What Is an Anonymous Inode in Linux
Nginx Redirect Url with Query Strings
Linux Shell Script to Add Leading Zeros to File Names
Specifying Udp Receive Buffer Size at Runtime in Linux
How to Calculate CPU Utilization of a Process & All Its Child Processes in Linux
Why Percent Signs (%) Do Not Work in Crontab
Rsync Copy Over Only Certain Types of Files Using Include Option
How Stable Is S3Fs to Mount an Amazon S3 Bucket as a Local Directory